1

我有一个表格。我包括道场。一切正常。我使用 Dojo 根据用户输入(类似于验证)更改输入元素的类、值和属性。

问题是,由于 IE,如果我想将输入的“类型”从“文本”更改为“密码”,我需要创建一个新的输入元素(我知道)。

一旦我创建了这个元素(它具有所有相同的属性和相同的 ID)作为它替换的元素,我的 Dojo 功能,例如......

dojo.query("#password2")
    .connect("onclick",function(){
        // if password2 is equal to the default text
        if( this.value == "Confirm your password" ){
            this.value = "";
            UpdateType( this );    // this is the function that dynamically creates the new input element to have a type of 'password' 
        }
        dojo.query("#list_password2").removeClass("error");
    });

...不再适用于新创建的元素。我之前遇到过这个问题,并且曾经使用过 jQuery,并且有一个 livequery 插件,可以将事件重新分配给元素。Dojo 是否有我不知道的插件或本机功能来执行此操作?

4

3 回答 3

4

好吧,谷歌的第一个结果是这个答案,而且它没有提供最新的响应,这很奇怪。

无论如何,对于那些需要将事件附加到动态创建的元素的人,从 dojo 1.7 开始,可以使用事件委托。一个简单的例子是:

require(["dojo/on", "dojo/query"], function(on) { 
    on(parentElement, '.child-selector:click', function(e) {
        alert('clicked');
    });
});

我相信这段代码是不言自明的,所以我不会详细说明。然而,关于事件委托有一些值得注意的地方:

请注意,事件委托仅适用于冒泡的事件。大多数 DOM 事件都会冒泡,但也有一些例外。和事件不会冒泡,但和mouseenter 是冒泡的对应物。和事件不会冒泡,但 dojo/on 标准化并作为冒泡等价物。此外,事件不会冒泡。mouseleavemouseovermouseoutfocusblurfocusinfocusoutscroll

当然,不要忘记加载第dojo/query一个......

请注意,必须加载 dojo/query 才能使事件委托工作。

阅读更多以获取更多说明...希望对您有所帮助!

于 2015-03-10T07:02:36.277 回答
1

我相信 Dojo 行为是您想要使用的机制。它将注册一个带有一些相关操作(“行为”)的 dojo.query 选择器。它将跟踪对 DOM 的更改并将行为重新应用于新的匹配项。

此链接应该会有所帮助: http ://dojocampus.org/content/2008/03/26/cleaning-your-markup-with-dojobehavior/

此外,您可能需要考虑使用基于类的选择样式而不是基于 id。根据我的经验,在某些浏览器中,删除然后添加具有相同 id 的 DOM 节点是有问题的。

于 2009-10-30T13:46:45.107 回答
1

首先,最初创建一些额外的字段,然后根据用户的选择显示/隐藏它们不是更容易吗?好吧,Dojo 中没有livequery ,但是使用 Dojo 的connect将事件处理程序绑定到给定的 id 而不是节点并不难。您只需要在节点层次结构中向上移动,捕获所有冒泡的事件并根据 id 过滤正确的节点。例如,如果您有一个带有 id 的表单login,您可以:

dojo.query( '#login' ).connect( 'click', function( evt ) {
    console.log( evt );
    if( evt.target.id == 'password2' ) {
        console.log('success');
    }
});

还可以在这里查看 jrburke 的回答:Can dojo access the function associated with a HTML elements Event?

于 2009-10-27T09:41:30.757 回答