Javascript 克隆和更改onchange参数在IE中不起作用

Javascript 克隆和更改onchange参数在IE中不起作用,javascript,jquery,internet-explorer,Javascript,Jquery,Internet Explorer,我的表单上有一个表,它有一行或多行,每行都包含一些字段,这些字段有onchange处理程序,这些处理程序包含包含tr的id,如中所示 我想克隆其中一行,并更新id和对onchange处理程序的调用。idGlob是具有行数计数的全局变量 function cloneLine(previd) { var id = '<% $prefix %>_row_' + idGlob; idGlob++; var $prevLine = jQuery('#' + previd);

我的表单上有一个表,它有一行或多行,每行都包含一些字段,这些字段有onchange处理程序,这些处理程序包含包含tr的id,如中所示

我想克隆其中一行,并更新id和对onchange处理程序的调用。idGlob是具有行数计数的全局变量

function cloneLine(previd) {
  var id = '<% $prefix %>_row_' + idGlob;
  idGlob++;

  var $prevLine = jQuery('#' + previd);

  var prevId = $prevLine.attr('id');

  var regExp = new RegExp(prevId, 'g');

  var replaceIdFunction = function(row, attr) {
    if (attr) {
      return attr.replace(regExp, id);
    }
  };

  var $newLine = $prevLine.clone();
  $newLine.attr('id', id).find('*').each(function(index, element) {
     jQuery(element).attr(
     {
        'id': replaceIdFunction,
        'onchange' : replaceIdFunction,
        'for' : replaceIdFunction,
        'onclick' : replaceIdFunction
     })
  });

  // XXX This is a work-around for a bug in Firefox.  Clone is supposed to
  // copy the value, but it doesnt for select and textarea!
  // https://bugzilla.mozilla.org/show_bug.cgi?id=230307
  $prevLine.
    find('select,textarea').each(function(index, element) {
        var $element = jQuery(element);
        var name = $element.attr('name');
        $newLine.find('[name="' + name + '"]').val(
            $element.val());
    });

  $prevLine.after($newLine);
}

这在所有常见的Chrome、Firefox、Safari中都能很好地工作,但在IE上由于一些奇怪的原因,即使你用Firebug Lite检查元素,它显示克隆具有onchange=changeAccessSystem'System\u row\u 1','environment',当你更改它时,调用changeAccessSystem函数时,第一个参数为“System\u row\u 0”。我调用.clone是否为真似乎无关紧要。

我之前在IE上遇到过这样的问题。我找到了两个解决方案。首先,从您选择的内联onchange事件中删除该函数。相反,使用jQuery/JavaScript添加事件。例如:

$("select").change(function(e) { // do work ....
其次,在旧版IE中,change/onchange事件不能正常启动。因此,您必须巧妙地处理propertychange事件。像这样:

$('select').bind($.browser.msie ? 'propertychange': 'change', function(e) { // do work
当然,您可以在事件函数中调用您的函数,并根据调用绑定事件的元素根据需要设置参数。如果您想要特定的计数或获取特定行数的父tr索引,或者等等,您也可以使用.each


希望这有帮助,如果需要更多的例子,请点击评论中的这篇文章。

我之前在IE上遇到过这样的问题。我找到了两个解决方案。首先,从您选择的内联onchange事件中删除该函数。相反,使用jQuery/JavaScript添加事件。例如:

$("select").change(function(e) { // do work ....
其次,在旧版IE中,change/onchange事件不能正常启动。因此,您必须巧妙地处理propertychange事件。像这样:

$('select').bind($.browser.msie ? 'propertychange': 'change', function(e) { // do work
当然,您可以在事件函数中调用您的函数,并根据调用绑定事件的元素根据需要设置参数。如果您想要特定的计数或获取特定行数的父tr索引,或者等等,您也可以使用.each


希望这有帮助,如果需要更多示例,请点击评论中的这篇文章。我花了一段时间更改了所有代码以使用它,但我改变了所有要使用的内容。on而不是您建议的。更改是因为它是动态的,但这肯定解决了问题。是的,我不确定您是否需要。on,但除了将事件添加到动态添加的元素之外,它也执行相同的操作。很高兴我能帮忙!我花了一段时间来更改所有代码以使用它,但我改变了所有要使用的内容。on而不是您建议的。更改是因为它都是动态的,但这肯定解决了问题。是的,我不确定您是否需要。on或否,但除了将事件添加到动态添加的元素之外,做了相同的事情。很高兴我能帮忙!