4

我正在尝试将函数绑定到锚点“onclick”属性。我没有使用传统的 jQuery 的 bind/live/on/whatever,因为我有一些其他脚本停止了事件传播(我知道这很糟糕)。

要将函数绑定到“onclick”属性,我将 JSON 对象传递给这样的模块:

function foo() {
  alert('foo')
}

$('document').ready(function() {
    var options = {
        opt1: 'fooID',
        opt2: 'barID',
        json: mightyJSON,
        actions: [
            { url: 'contact/_id_/edit', text: "Edit", iconPath: 'edit.png' },
            { url: '#', onClick: foo, text: "Delete", iconPath: 'delete.png' }
        ]
    };

    var trolol = myModule.configure(options);
});

如您所见,名为“foo”的函数是通过 JSON 的“onClick”属性传递的。函数在对象之上定义。

在“myModule”中,我正在创建这样的锚标记:

var buildLinks = function(objectID)
{
  var linksNbr = actions.length;
  var link, cssClass;

  for (var i = 0; i < linksNbr; i++)
  {
    // Adding the object ID to the URL
    link     = actions[i].url.replace('_id_', objectID);
    cssClass = actions[i].cssClass || '';

    var $link = $(document.createElement('a')).attr('onClick', actions[i].onClick)
                                              .attr('href', link)
                                              .attr('title', actions[i].text)
                                              .addClass(cssClass)
                                              .text('foo');
  }

  return $link.html();
};

问题是,正如您所期望的那样,'foo' 在脚本被解析时被执行,并且只有在那里。“onclick”之后甚至不起作用。

我可以这样通过onClick: 'foo()'。onclick 有效,但它也在解析时执行,在我看来,它非常难看。

我希望仍然能够像这样传递它onClick: foo但工作正常(即在加载时不执行,但仅在单击时执行。

不幸的是,它必须与 jQuery 1.4.4 一起工作。

4

3 回答 3

0
  1. 如果可能的话,返回元素,而不是它的.html()

  2. .attr('onclick', ...)完成之后,当你已经有一个函数引用时不要使用,使用.prop,甚至只是element.onclick = ...

例如

$link = $('<a>', {
    href: link,
    title: actions[i].text,
    'class': cssClass,
    text: 'foo'
}).prop('onclick', actions[i].onClick);
于 2012-08-06T08:38:09.710 回答
0

我会这样做:

var $link = $('<a></a>',{
    href : link,
    title : actions[i].text,
    'class' : cssClass,
    text : 'foo',
    click : actions[i].onclick
})
return $link;

然后使用这些 ( 1 , 2 ) 函数之一插入节点,即带有事件的 html。


对于传播问题,我会这样做:

html<a href="#no" ....>text</a>

js$('a[href="#no"]').live('click',function(){ return false; });

这样,每当href指向#no事件时,最终都会传播

于 2012-08-06T08:44:04.753 回答
0

这是一个小提琴片段。如果这种方法很好,您可以如下在 jquery 的原始元素上设置 onclick,如下所示:

$link[0].onclick = options.actions[i].onClick;
于 2012-08-06T09:02:21.743 回答