1

我的表单上有一个表,其中包含一行或多行,每行包含一些<select> 和<input>字段,这些字段具有包含包含的 id 的 onchange 处理程序tr,如

<select id="System_row_0_environment" class="fixedwidth" 
  onchange="changeAccessSystem('System_row_0', 'environment')" name="System_environment">

我想克隆其中一行,并更新 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_row_1', 'environment'),当您更改它时,changeAccessSystem 函数被调用第一个参数是“System_row_0”。我是否打电话似乎并不重要.clonetruefalse

4

1 回答 1

1

在我之前对 IE 有过这样的麻烦。我找到了 2 个解决方案。首先,从您选择的内联“onchange”事件中删除该函数。相反,使用 jQuery/JavaScript 添加事件。如:

$("select").change(function(e) { // do work ....

其次,在较旧的 IE 中,change/onchange 事件无法正常触发。因此,您必须巧妙地处理“propertychange”事件。像这样:

$('select').bind($.browser.msie ? 'propertychange': 'change', function(e) { // do work

当然,您可以在事件函数中调用您的函数,并根据调用绑定事件的元素根据需要设置参数。你也可以使用.each,如果你想要一个特定的计数或获取特定行号的父 tr 索引,等等....

希望这会有所帮助,如果需要更多示例,请在评论中点击此帖子

于 2012-10-02T17:51:32.517 回答