Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript dojo如何重写dijit类方法_Javascript_Dojo_Dom Events - Fatal编程技术网

Javascript dojo如何重写dijit类方法

Javascript dojo如何重写dijit类方法,javascript,dojo,dom-events,Javascript,Dojo,Dom Events,我需要重写Tree.js中的onClick方法。有没有通用的方法覆盖dojo/dijit类方法?您可以使用: dojo.connect(tree, 'onClick', function(item) { /** Your Action **/ }); 我有点困惑,因为你已经在做这个了 你有一些选择,这取决于你想做什么 重击法 在像onClick这样的真正存根的情况下,它可能与在小部件实例上重击该方法一样简单 以编程方式: var myWidget = new dijit.Tree({

我需要重写Tree.js中的onClick方法。有没有通用的方法覆盖dojo/dijit类方法?

您可以使用:

dojo.connect(tree, 'onClick', function(item) {
    /** Your Action **/
});

我有点困惑,因为你已经在做这个了

你有一些选择,这取决于你想做什么

重击法 在像
onClick
这样的真正存根的情况下,它可能与在小部件实例上重击该方法一样简单

以编程方式:

var myWidget = new dijit.Tree({
    ...,
    onClick: function(item, node, evt) {
        /* handler code here */
    }
};
//execute the given function whenever myWidget's onClick method is called
myWidget.connect(myWidget, 'onClick', function(item, node, evt) {
    /* handler code here */
});
或者声明(这与您在上一个问题中所做的完全相同):

声明性地说,这可以非常类似于上述操作,除了使用
type=“dojo/method”
而不是
type=“dojo/connect”

此解决方案可能感觉有点次优,因为它涉及到连接到建议为私有的方法。然而,无论
openOnClick
是否正确,这种方法都应该有效。如果确定要将
openOnClick
设置为
true
,则可以编写一个函数,然后将其连接到
onClick
onOpen
(两个函数都传递了项,然后是节点)

编辑#2:公共函数,以编程方式连接 为了回答您的后续问题,我想以相反的顺序来回答它们——因为如果您对以编程方式连接感兴趣,它实际上会使另一个问题更容易回答

因此,首先,回答您的
connect
问题:您肯定不想使用
dojo.byId
,因为这不是给您树小部件,而是给您一些与小部件关联的DOM节点(可能是最上面的)。一般来说,
dojo
方法对
dijit
东西一无所知

你想做什么,就是我上面建议的。在这里,它是根据您尝试的代码应用的。还要注意,
onClick
有一个大写字母C,这是另一个一般规则:小部件事件使用驼峰大小写表示法,作为区别于普通DOM事件的一种方法,普通DOM事件不使用驼峰大小写

var mytree = dijit.byId("mytree");
mytree.connect(mytree, "onClick", function(item) {
    /* ... */
});
现在,为了进一步解决您的其他问题,如果您想将一些常见功能绑定到
onClick
onOpen
onClose
,您可以先定义一个函数,然后将其连接到这两个函数。这是JavaScript令人敬畏的诸多因素之一——函数作为一级对象的可用性,可以轻松地传递

function handleClick(item) {
    /* do stuff here.
    Inside this function you can assume 'this' is the tree,
    since connect will ensure it runs in-context.
    */
}
var mytree = dijit.byId("mytree");
mytree.connect(mytree, "onClick", handleClick);
mytree.connect(mytree, "onOpen", handleClick);
mytree.connect(mytree, "onClose", handleClick);
现在还有一个重要的问题:我们应该在哪里做?最好的位置可能是在传递给
dojo.ready
(或
dojo.addOnLoad
,同样的,
ready
在1.4中作为同义词添加)的函数中,以便它仅在以下情况下运行:

  • DOM由浏览器解析
  • 所有
    dojo.require
    d模块都已加载
  • 如果在
    djConfig
    中设置
    parseOnLoad:true
    ,则文档HTML中定义的所有小部件都将被实例化
因此,在您的
dojo.require
s之后的某个时间,在脚本中,您可以执行以下操作:

dojo.ready(function() {
    /* code from previous example goes here */
});
试试看

另外,如果您对阅读感兴趣,我实际上已经写了我在本编辑中涉及的几个主题:


我的onClick问题根本就没有被解雇。我抓不到它。如果您查看树代码,它会这样说:如果节点可展开,请展开它,否则请执行其他操作。我需要有,如果不是可扩展的扩展和做一些事情。当openOnClick=“true”且节点可扩展时,我无法捕获onClick事件。到目前为止,你的建议对我没有任何作用。在这种情况下,(1)你并没有真正提出你实际提出的问题,(2)我在回答你的另一个问题时回答了你提出的问题(我在回答的顶部链接了这个问题)。要重复这两个答案,您应该能够使用此处给出的连接方法连接到树的
\onClick
方法来执行您想要的操作。因为我们已经知道我在问什么问题。请你写几行代码作为回应好吗。考虑到我的代码是:console.debug(“我们在这里”);我到底应该写什么?很抱歉说得不清楚。我已经添加了一个样本,完全按照我在对另一个答案的评论中所说的去做-我真的不确定是什么让人难以理解。。。但我还是很困惑,因为在那个帖子上,你说你把
openOnClick
改为
false
,这也能解决你的问题。首先,如果你不想回答,就不要回答。其次,我认为它解决了我的问题,因为我可以通过单击节点捕捉事件,并通过单击“+”符号展开节点。但实际上我需要两种功能。我之所以一次又一次地问你,是因为我无法将你的答案与我能用的东西联系起来。我没有网络经验,只有两个词回答“使用点击”没有帮助。再说一次,你不必回答。
var mytree = dijit.byId("mytree");
mytree.connect(mytree, "onClick", function(item) {
    /* ... */
});
function handleClick(item) {
    /* do stuff here.
    Inside this function you can assume 'this' is the tree,
    since connect will ensure it runs in-context.
    */
}
var mytree = dijit.byId("mytree");
mytree.connect(mytree, "onClick", handleClick);
mytree.connect(mytree, "onOpen", handleClick);
mytree.connect(mytree, "onClose", handleClick);
dojo.ready(function() {
    /* code from previous example goes here */
});