jQuery |无法从字符串中添加点击事件?

时间:2018-03-17 10:12:42

标签: javascript jquery

描述

我想从一个元素中删除一个onclick属性,而是将它的函数绑定到它的click事件。

$("[onclick]").each(function() {
  //Entfernt normales Event
  $(this).off("click");  
  //bindet altes Event
  try {
      $(this).on( "click", $(this).attr("onclick"));
      document.write('successly freed onclick');
  } catch(e) {
      document.write('failed');
      console.warn(e);
      $("[error]").val(e);
  }
  //Entfernt attribut (cosmetic)
  $(this).removeAttr("onclick");
});
textarea {
  position: absolute;
  background: whitesmoke;
  color: dimgray;
  font-family: monospace;
  top: 15%;
  left: 0;
  border: red 2px solid;
  resize: none;
  height: 40vh;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button onclick="alert('beep')">Boo</button>
<textarea error></textarea>

但这失败了。

未捕获的TypeError:无法在字符串x

上创建属性'guid'

有人可以帮我吗?

链接到测试用例

https://codepen.io/Blubbll/pen/aYZQjg

1 个答案:

答案 0 :(得分:1)

您需要使用prop('onclick')代替attr,因为attr将返回一个简单的字符串。 jQuery试图将字符串alert('beep')放入函数中以将其分配给点击,并在jQuery中导致一些错误。

  

prop()获取匹配元素集中第一个元素的属性值,或为每个匹配元素设置一个或多个属性。

     

attr()获取匹配元素集中第一个元素的属性值,或为每个匹配元素设置一个或多个属性。

&#13;
&#13;
$("[onclick]").each(function() {
  //Entfernt normales Event
  $(this).off("click");  
  //bindet altes Event
  try {
  console.log($(this).prop("onclick"));
    $(this).on( "click", $(this).prop("onclick"));
    document.write('successly freed onclick');
  }
  catch(e) {
    document.write('failed');
    console.warn(e);
    $("[error]").val(e);
  }
  $(this).removeAttr("onclick")
});
&#13;
textarea {
  position: absolute;
  background: whitesmoke;
  color: dimgray;
  font-family: monospace;
  top: 15%;
  left: 0;
  border: red 2px solid;
  resize: none;
  height: 40vh;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button onclick="alert('beep')">Boo</button>
<textarea error>
</textarea>
&#13;
&#13;
&#13;