Javascript DOM事件和sencha事件之间的事件顺序

Javascript DOM事件和sencha事件之间的事件顺序,javascript,extjs,extjs7,Javascript,Extjs,Extjs7,我有一个用extjs 7.1 modern tookit编写的dataview,它有一个带有锚定标记和选择事件的模板: Ext.create({ renderTo:document.body, xtype:'列表', itemTpl:“{lastName}”, 商店:{ 数据:[{ 名字:“彼得”, 姓:“文克曼” }, { 名字:“雷蒙德”, 姓:“斯坦茨” }, { 名字:“伊贡”, 姓氏:“斯宾格勒” }, { 名字:“温斯顿”, 姓氏:'Zeddemore' }] }, 听众:{ se

我有一个用extjs 7.1 modern tookit编写的dataview,它有一个带有锚定标记和选择事件的模板:

Ext.create({
renderTo:document.body,
xtype:'列表',
itemTpl:“{lastName}”,
商店:{
数据:[{
名字:“彼得”,
姓:“文克曼”
}, {
名字:“雷蒙德”,
姓:“斯坦茨”
}, {
名字:“伊贡”,
姓氏:“斯宾格勒”
}, {
名字:“温斯顿”,
姓氏:'Zeddemore'
}]
},
听众:{
select(){console.log('select');}
}
});

我预计链接事件将在列表选择事件之前触发,但情况正好相反,甚至最糟糕的两个事件都将一个接一个地触发。

列表的onItemDisclosure属性而不是链接如何

使用MDisClosure函数并选择listener来分隔两个操作

onItemDisclosure:布尔/函数/字符串/对象可绑定

设置为true可在每个列表项上显示披露图标。然后,列表将触发披露事件,并且该事件可以在childtap之前停止。通过将此配置设置为函数,在点击公开时将调用传递的函数。这可以是函数对象,也可以是Ext.app.ViewController方法的名称

最后,您可以指定一个定义了作用域和处理程序属性的对象。这也将绑定到tap事件侦听器,在您想要更改处理程序的范围时非常有用

xtype:'list',
第三方物流:[
'',
'',
“{firstName}{lastName}”,
'',
''
],
OSCLOSURE:功能(记录、btn、索引){
console.log(“披露”);
Ext.Msg.alert('Tap','discover more information for'+record.get('firstName'),Ext.emptyFn);
},
商店:{
数据:[{
名字:“彼得”,
姓:“文克曼”
}, {
名字:“雷蒙德”,
姓:“斯坦茨”
}, {
名字:“伊贡”,
姓氏:“斯宾格勒”
}, {
名字:“温斯顿”,
姓氏:'Zeddemore'
}]
},
听众:{
选择(){
console.log('select');
}
}

以下是示例

如何使用列表的MDisClosure属性而不是链接

使用MDisClosure函数并选择listener来分隔两个操作

onItemDisclosure:布尔/函数/字符串/对象可绑定

设置为true可在每个列表项上显示披露图标。然后,列表将触发披露事件,并且该事件可以在childtap之前停止。通过将此配置设置为函数,在点击公开时将调用传递的函数。这可以是函数对象,也可以是Ext.app.ViewController方法的名称

最后,您可以指定一个定义了作用域和处理程序属性的对象。这也将绑定到tap事件侦听器,在您想要更改处理程序的范围时非常有用

xtype:'list',
第三方物流:[
'',
'',
“{firstName}{lastName}”,
'',
''
],
OSCLOSURE:功能(记录、btn、索引){
console.log(“披露”);
Ext.Msg.alert('Tap','discover more information for'+record.get('firstName'),Ext.emptyFn);
},
商店:{
数据:[{
名字:“彼得”,
姓:“文克曼”
}, {
名字:“雷蒙德”,
姓:“斯坦茨”
}, {
名字:“伊贡”,
姓氏:“斯宾格勒”
}, {
名字:“温斯顿”,
姓氏:'Zeddemore'
}]
},
听众:{
选择(){
console.log('select');
}
}
下面是一个例子


我正试图按照你的建议理解用户点击的位置,但我不知道怎么做

正如@LightNight所说,在选择之前,您可以使用
childtap
事件来运行所需的处理程序。如果您想了解单击发生的位置,只需使用
event.target
。看我的


我正试图按照你的建议理解用户点击的位置,但我不知道怎么做


正如@LightNight所说,在选择之前,您可以使用
childtap
事件来运行所需的处理程序。如果您想了解单击发生的位置,只需使用
event.target
。看看我的

在您的小提琴示例中,itemtap从6.5.0版开始就不推荐使用,请使用childtap。关于您的期望,为什么您不能在childtap事件中编写链接逻辑?如果用户单击某个特定链接或整个列表项,我需要执行不同的操作。我正试图了解用户按您的建议单击的位置,但我不知道如何操作。您可以在sencha fiddle中看到代码:在您的fiddle示例中,itemtap从版本6.5.0开始就不推荐使用,请使用childtap。关于您的期望,为什么您不能在childtap事件中编写链接逻辑?如果用户单击某个特定链接或整个列表项,我需要执行不同的操作。我正试图了解用户按您的建议单击的位置,但我不知道如何操作。您可以在sencha fiddle中看到代码:好主意,但我的真实数据有点复杂。我更新了fiddle(),建议使用childtap而不是selected。在本例中,我有一个对clicked元素的引用,所以我可以做这项工作。好主意,但我的真实数据有点复杂。我更新了fiddle(),建议使用childtap而不是selected。在这种情况下,我有一个对clicked元素的引用,这样我就可以完成这项工作。
Ext.create({
    renderTo: document.body,

    xtype: 'list',
    itemTpl: '<div class="contact"><a onclick="event.preventDefault();console.log(\'link\');" href="{firstName}">{firstName}</a> <b>{lastName}</b></div>',

    store: {

        data: [{
            firstName: 'Peter',
            lastName: 'Venkman'
        }, {
            firstName: 'Raymond',
            lastName: 'Stantz'
        }, {
            firstName: 'Egon',
            lastName: 'Spengler'
        }, {
            firstName: 'Winston',
            lastName: 'Zeddemore'
        }]
    },
    listeners: {
        select() { console.log('select'); }
    }
});
xtype: 'list',
itemTpl: [
    '<div class="contact">',
    '<b>',
    '{firstName} {lastName}',
    '</b>',
    '</div>'
],
onItemDisclosure: function (record, btn, index) {
    console.log('Disclosure');
    Ext.Msg.alert('Tap', 'Disclose more info for ' + record.get('firstName'), Ext.emptyFn);
},
store: {

    data: [{
        firstName: 'Peter',
        lastName: 'Venkman'
    }, {
        firstName: 'Raymond',
        lastName: 'Stantz'
    }, {
        firstName: 'Egon',
        lastName: 'Spengler'
    }, {
        firstName: 'Winston',
        lastName: 'Zeddemore'
    }]
},
listeners: {
        select() {
            console.log('select');
        }
}