代码之家  ›  专栏  ›  技术社区  ›  chenzhongpu

如何在html模板中绑定事件?

  •  0
  • chenzhongpu  · 技术社区  · 7 年前

    请参考我之前的问题: How to get element in template html? .

    首先,我遵循 如何在模板html中获取元素? 获取元素。

    var template = templateContent.content;
    

    然后我试着绑一个 click 事件为 searchBtn :

    searchBtn.addEventListener('click', function() {
        console.log('click'); // does not work
    });
    

    此绑定失败,因此我使用事件委派处理事件:

    document.addEventListener('click',function(e){
        if(e.target && e.target.id== 'searchBtn'){
            console.log('click');
            console.log(template.querySelector('#results'));
            template.querySelector('#results').innerText = 'Foo';
        }
     });
    

    这两个日志是预期的,但是更新 innerText 不起作用。另一方面,我可以在click事件之外更新它的内容。有什么解决办法吗?

    我的代码的最终版本:

    var link = document.querySelector('link[rel="import"][href="search.html"]');
    var templateContent = link.import.querySelector('template');
    var template = templateContent.content;
    var searchBtn = template.querySelector('#searchBtn'); 
    console.log(searchBtn); 
    template.querySelector('#results').innerText = 'Bar'; // ok
    
    document.addEventListener('click',function(e){
        if(e.target && e.target.id== 'searchBtn'){
            console.log('click'); // ok
            console.log(template.querySelector('#results')); // ok
            template.querySelector('#results').innerText = 'Foo'; // does not work
        }
     });
    

    更新

    现在我找回了 results 函数之外的元素:

    var results = template.querySelector('#results');
    

    然后在函数内部, results.innerText = 'Foo'; 作品。但是,这只会更新 结果 而用户界面则不会相应地更新。

    如何更新模板内的ui?

    3 回复  |  直到 7 年前
        1
  •  0
  •   Narendra    7 年前

    你说得对,这是有约束力的问题。 模板 在单击函数中不可用。你得把这个绑起来。有很多方法可以做到这一点,例如。

    document.addEventListener('click',onClick.bind(this));
    
    
     onClick = function(e){
        if(e.target && e.target.id== 'searchBtn'){
            console.log('click'); // ok
            console.log(template.querySelector('#results')); // ok
            this.template.querySelector('#results').innerText = 'Foo'; // should work
        }
     }
    
        2
  •  -1
  •   Scott Lee    7 年前

    有很多方法可以获取html元素

    你可以利用

    var sbtnElement = document.getElementById('searchBtn');
    

    然后将eventlistener添加到其中

    sbtnElement.addEventlistener('click', function() {
       console.log('click'); // does not work
    });
    

    当然,getelement by id将给您一个元素,getelementsbyclassname将返回一个具有相同类名的元素数组。getelementsbytagname也是如此。

        3
  •  -2
  •   Agent Droid    7 年前

    嗨,我不知道你想做什么。但是你试过在脚本中使用模板吗?像这个

    <script id="sampleTemplate" type="text/template">
       // do the html here
    </script>
    

    所以在这种情况下,可以使用该事件绑定事件。只是一个普通的html创建和绑定javascript函数。

    你可以参考这个博客。 https://jonsuh.com/blog/javascript-templating-without-a-library/

    我希望,我帮你渡过了难关。:)