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 Nov 12 at 8:17
asked Nov 9 at 13:49
Lajos Arpad
27.2k1861116
27.2k1861116
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 |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
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
Required, but never shown
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
Required, but never shown
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 Nov 12 at 8:16
Lajos Arpad
27.2k1861116
27.2k1861116
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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
Required, but never shown
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
Required, but never shown
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
Required, but never shown
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
Required, but never shown
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
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
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