How to make sure my directive runs a function?
up vote
0
down vote
favorite
I have this Vue code:
export default
data: function()
return
'showPopup': false
,
components:
'search-bar': SearchBarComponent,
,
mounted: function()
$(this.$el).foundation();
,
updated: function()
$(this.$el).foundation();
,
methods:
clickOutsidePopup: function(event)
console.log(event);
,
directives:
clickoutside:
bind (el)
el.event = event => el.vm.$emit(el.expression, event)
el.addEventListener('click', el.stopProp)
document.body.addEventListener('click', event)
,
unbind(el)
el.removeEventListener('click', el.stopProp)
document.body.removeEventListener('click', el.event)
,
stopProp(event) event.stopPropagation()
And inside the template I have this:
<div class="small-screen popup-container">
<div class="popup" v-show="showPopup" v-clickoutside="clickOutsidePopup">
<search-bar />
</div>
</div>
which will be shown/hidden if we click on this:
<a href="#"> <span @click="showPopup = !showPopup">🔍</span></a>
My problem is that my directive does not execute clickOutsidePopup
. When I click outside of my element? I was inspired by this: Detect click outside element
vue.js vue-component
add a comment |
up vote
0
down vote
favorite
I have this Vue code:
export default
data: function()
return
'showPopup': false
,
components:
'search-bar': SearchBarComponent,
,
mounted: function()
$(this.$el).foundation();
,
updated: function()
$(this.$el).foundation();
,
methods:
clickOutsidePopup: function(event)
console.log(event);
,
directives:
clickoutside:
bind (el)
el.event = event => el.vm.$emit(el.expression, event)
el.addEventListener('click', el.stopProp)
document.body.addEventListener('click', event)
,
unbind(el)
el.removeEventListener('click', el.stopProp)
document.body.removeEventListener('click', el.event)
,
stopProp(event) event.stopPropagation()
And inside the template I have this:
<div class="small-screen popup-container">
<div class="popup" v-show="showPopup" v-clickoutside="clickOutsidePopup">
<search-bar />
</div>
</div>
which will be shown/hidden if we click on this:
<a href="#"> <span @click="showPopup = !showPopup">🔍</span></a>
My problem is that my directive does not execute clickOutsidePopup
. When I click outside of my element? I was inspired by this: Detect click outside element
vue.js vue-component
There's a working example in the linked SO post, why are you not using it?
– Bennett Dams
Nov 9 at 14:03
It involves a global directive. I intend to do this on component level.
– Lajos Arpad
Nov 9 at 14:06
1
I recreated the example with a component directive and it works absolutely fine: jsfiddle.net/fj94mkpe The difference between your code and the example is the usage of the event as function parameter at the directive.
– Bennett Dams
Nov 9 at 14:13
@BennettDams in the meantime I managed to make it work as well, see the edit on the question. Now the problem is that in mobile browsers the search button works (shows/hides the bar), but clicking outside the bar does not fire the event.
– Lajos Arpad
Nov 9 at 14:17
@BennettDams my new problem is not related to my original question and your code is more-or-less equivalent to the solution I have reached independently from you. If you convert your comment into an answer, I will accept it.
– Lajos Arpad
Nov 9 at 14:28
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I have this Vue code:
export default
data: function()
return
'showPopup': false
,
components:
'search-bar': SearchBarComponent,
,
mounted: function()
$(this.$el).foundation();
,
updated: function()
$(this.$el).foundation();
,
methods:
clickOutsidePopup: function(event)
console.log(event);
,
directives:
clickoutside:
bind (el)
el.event = event => el.vm.$emit(el.expression, event)
el.addEventListener('click', el.stopProp)
document.body.addEventListener('click', event)
,
unbind(el)
el.removeEventListener('click', el.stopProp)
document.body.removeEventListener('click', el.event)
,
stopProp(event) event.stopPropagation()
And inside the template I have this:
<div class="small-screen popup-container">
<div class="popup" v-show="showPopup" v-clickoutside="clickOutsidePopup">
<search-bar />
</div>
</div>
which will be shown/hidden if we click on this:
<a href="#"> <span @click="showPopup = !showPopup">🔍</span></a>
My problem is that my directive does not execute clickOutsidePopup
. When I click outside of my element? I was inspired by this: Detect click outside element
vue.js vue-component
I have this Vue code:
export default
data: function()
return
'showPopup': false
,
components:
'search-bar': SearchBarComponent,
,
mounted: function()
$(this.$el).foundation();
,
updated: function()
$(this.$el).foundation();
,
methods:
clickOutsidePopup: function(event)
console.log(event);
,
directives:
clickoutside:
bind (el)
el.event = event => el.vm.$emit(el.expression, event)
el.addEventListener('click', el.stopProp)
document.body.addEventListener('click', event)
,
unbind(el)
el.removeEventListener('click', el.stopProp)
document.body.removeEventListener('click', el.event)
,
stopProp(event) event.stopPropagation()
And inside the template I have this:
<div class="small-screen popup-container">
<div class="popup" v-show="showPopup" v-clickoutside="clickOutsidePopup">
<search-bar />
</div>
</div>
which will be shown/hidden if we click on this:
<a href="#"> <span @click="showPopup = !showPopup">🔍</span></a>
My problem is that my directive does not execute clickOutsidePopup
. When I click outside of my element? I was inspired by this: Detect click outside element
vue.js vue-component
vue.js vue-component
edited yesterday
asked Nov 9 at 13:49
Lajos Arpad
26.8k1861116
26.8k1861116
There's a working example in the linked SO post, why are you not using it?
– Bennett Dams
Nov 9 at 14:03
It involves a global directive. I intend to do this on component level.
– Lajos Arpad
Nov 9 at 14:06
1
I recreated the example with a component directive and it works absolutely fine: jsfiddle.net/fj94mkpe The difference between your code and the example is the usage of the event as function parameter at the directive.
– Bennett Dams
Nov 9 at 14:13
@BennettDams in the meantime I managed to make it work as well, see the edit on the question. Now the problem is that in mobile browsers the search button works (shows/hides the bar), but clicking outside the bar does not fire the event.
– Lajos Arpad
Nov 9 at 14:17
@BennettDams my new problem is not related to my original question and your code is more-or-less equivalent to the solution I have reached independently from you. If you convert your comment into an answer, I will accept it.
– Lajos Arpad
Nov 9 at 14:28
add a comment |
There's a working example in the linked SO post, why are you not using it?
– Bennett Dams
Nov 9 at 14:03
It involves a global directive. I intend to do this on component level.
– Lajos Arpad
Nov 9 at 14:06
1
I recreated the example with a component directive and it works absolutely fine: jsfiddle.net/fj94mkpe The difference between your code and the example is the usage of the event as function parameter at the directive.
– Bennett Dams
Nov 9 at 14:13
@BennettDams in the meantime I managed to make it work as well, see the edit on the question. Now the problem is that in mobile browsers the search button works (shows/hides the bar), but clicking outside the bar does not fire the event.
– Lajos Arpad
Nov 9 at 14:17
@BennettDams my new problem is not related to my original question and your code is more-or-less equivalent to the solution I have reached independently from you. If you convert your comment into an answer, I will accept it.
– Lajos Arpad
Nov 9 at 14:28
There's a working example in the linked SO post, why are you not using it?
– Bennett Dams
Nov 9 at 14:03
There's a working example in the linked SO post, why are you not using it?
– Bennett Dams
Nov 9 at 14:03
It involves a global directive. I intend to do this on component level.
– Lajos Arpad
Nov 9 at 14:06
It involves a global directive. I intend to do this on component level.
– Lajos Arpad
Nov 9 at 14:06
1
1
I recreated the example with a component directive and it works absolutely fine: jsfiddle.net/fj94mkpe The difference between your code and the example is the usage of the event as function parameter at the directive.
– Bennett Dams
Nov 9 at 14:13
I recreated the example with a component directive and it works absolutely fine: jsfiddle.net/fj94mkpe The difference between your code and the example is the usage of the event as function parameter at the directive.
– Bennett Dams
Nov 9 at 14:13
@BennettDams in the meantime I managed to make it work as well, see the edit on the question. Now the problem is that in mobile browsers the search button works (shows/hides the bar), but clicking outside the bar does not fire the event.
– Lajos Arpad
Nov 9 at 14:17
@BennettDams in the meantime I managed to make it work as well, see the edit on the question. Now the problem is that in mobile browsers the search button works (shows/hides the bar), but clicking outside the bar does not fire the event.
– Lajos Arpad
Nov 9 at 14:17
@BennettDams my new problem is not related to my original question and your code is more-or-less equivalent to the solution I have reached independently from you. If you convert your comment into an answer, I will accept it.
– Lajos Arpad
Nov 9 at 14:28
@BennettDams my new problem is not related to my original question and your code is more-or-less equivalent to the solution I have reached independently from you. If you convert your comment into an answer, I will accept it.
– Lajos Arpad
Nov 9 at 14:28
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
I managed to make it work with this directive code:
directives:
clickoutside:
bind: function (el, binding, vnode)
el.clickOutsideEvent = function (event) el.contains(event.target)))
// and if it did, call method provided in attribute value
vnode.context[binding.expression](event);
;
document.body.addEventListener('click', el.clickOutsideEvent)
,
unbind: function (el)
document.body.removeEventListener('click', el.clickOutsideEvent)
,
added an id to the search button:
<span id="top-bar-search-icon" @click="showPopup = !sho wPopup">🔍</span>
and modified my method:
methods:
clickOutsidePopup: function(event)
if (event.target.id !== "top-bar-search-icon")
this.showPopup = false;
,
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
I managed to make it work with this directive code:
directives:
clickoutside:
bind: function (el, binding, vnode)
el.clickOutsideEvent = function (event) el.contains(event.target)))
// and if it did, call method provided in attribute value
vnode.context[binding.expression](event);
;
document.body.addEventListener('click', el.clickOutsideEvent)
,
unbind: function (el)
document.body.removeEventListener('click', el.clickOutsideEvent)
,
added an id to the search button:
<span id="top-bar-search-icon" @click="showPopup = !sho wPopup">🔍</span>
and modified my method:
methods:
clickOutsidePopup: function(event)
if (event.target.id !== "top-bar-search-icon")
this.showPopup = false;
,
add a comment |
up vote
0
down vote
I managed to make it work with this directive code:
directives:
clickoutside:
bind: function (el, binding, vnode)
el.clickOutsideEvent = function (event) el.contains(event.target)))
// and if it did, call method provided in attribute value
vnode.context[binding.expression](event);
;
document.body.addEventListener('click', el.clickOutsideEvent)
,
unbind: function (el)
document.body.removeEventListener('click', el.clickOutsideEvent)
,
added an id to the search button:
<span id="top-bar-search-icon" @click="showPopup = !sho wPopup">🔍</span>
and modified my method:
methods:
clickOutsidePopup: function(event)
if (event.target.id !== "top-bar-search-icon")
this.showPopup = false;
,
add a comment |
up vote
0
down vote
up vote
0
down vote
I managed to make it work with this directive code:
directives:
clickoutside:
bind: function (el, binding, vnode)
el.clickOutsideEvent = function (event) el.contains(event.target)))
// and if it did, call method provided in attribute value
vnode.context[binding.expression](event);
;
document.body.addEventListener('click', el.clickOutsideEvent)
,
unbind: function (el)
document.body.removeEventListener('click', el.clickOutsideEvent)
,
added an id to the search button:
<span id="top-bar-search-icon" @click="showPopup = !sho wPopup">🔍</span>
and modified my method:
methods:
clickOutsidePopup: function(event)
if (event.target.id !== "top-bar-search-icon")
this.showPopup = false;
,
I managed to make it work with this directive code:
directives:
clickoutside:
bind: function (el, binding, vnode)
el.clickOutsideEvent = function (event) el.contains(event.target)))
// and if it did, call method provided in attribute value
vnode.context[binding.expression](event);
;
document.body.addEventListener('click', el.clickOutsideEvent)
,
unbind: function (el)
document.body.removeEventListener('click', el.clickOutsideEvent)
,
added an id to the search button:
<span id="top-bar-search-icon" @click="showPopup = !sho wPopup">🔍</span>
and modified my method:
methods:
clickOutsidePopup: function(event)
if (event.target.id !== "top-bar-search-icon")
this.showPopup = false;
,
answered yesterday
Lajos Arpad
26.8k1861116
26.8k1861116
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226967%2fhow-to-make-sure-my-directive-runs-a-function%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
There's a working example in the linked SO post, why are you not using it?
– Bennett Dams
Nov 9 at 14:03
It involves a global directive. I intend to do this on component level.
– Lajos Arpad
Nov 9 at 14:06
1
I recreated the example with a component directive and it works absolutely fine: jsfiddle.net/fj94mkpe The difference between your code and the example is the usage of the event as function parameter at the directive.
– Bennett Dams
Nov 9 at 14:13
@BennettDams in the meantime I managed to make it work as well, see the edit on the question. Now the problem is that in mobile browsers the search button works (shows/hides the bar), but clicking outside the bar does not fire the event.
– Lajos Arpad
Nov 9 at 14:17
@BennettDams my new problem is not related to my original question and your code is more-or-less equivalent to the solution I have reached independently from you. If you convert your comment into an answer, I will accept it.
– Lajos Arpad
Nov 9 at 14:28