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










share|improve this question























  • 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














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










share|improve this question























  • 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












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










share|improve this question















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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
















  • 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












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;

,





share|improve this answer




















    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
    );



    );













     

    draft saved


    draft discarded


















    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






























    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;

    ,





    share|improve this answer
























      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;

      ,





      share|improve this answer






















        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;

        ,





        share|improve this answer












        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;

        ,






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered yesterday









        Lajos Arpad

        26.8k1861116




        26.8k1861116



























             

            draft saved


            draft discarded















































             


            draft saved


            draft discarded














            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














































































            Popular posts from this blog

            Use pre created SQLite database for Android project in kotlin

            Darth Vader #20

            Ondo