我正在通过JavaScript创建一个按钮,并尝试将其分配给onclick事件。在运行时,按钮已创建,但单击onclick
事件时未触发。同样在Chrome的Inspector中,单击按钮时不会生成错误。
这是我的代码:
function truncator(){
$.each($('td.rawdata-field').not(':empty'), function(i,v){
var count = parseInt($(v).text().length);
var maxChars = 650;
if(count > maxChars){
var str = $(v).text();
var trimmed = str.substr(0, maxChars - 2);
$(v).text(trimmed + '...');
var btn = document.createElement('button');
btn.setAttribute('content', 'test content');
btn.setAttribute('class', 'show-full-text-button');
btn.innerHTML = 'Show Full Log';
btn.onclick = function() {
alert("assd");
};
$(v).append(btn);
}
});
};
v
是父容器,在本例中是td
元素。
这里有什么问题?
修改: 我可以提供的另一个细节是,上面的内容在页面上执行了很多次,这与它无法正常工作有关。所有按钮都正常创建,但通过上述方法完成时警报不起作用。
执行上述代码时,容器已存在。
编辑2:
我已经更新了上面的代码,以包含更多正在发生的事情。函数truncator
基本上应该遍历所有td
个类rawdata-field
非空的元素,并检查其中提到的文本是否超过650个字符。如果是,它会将文本截断为650个字符,然后在那里放置一个按钮以显示完整的日志(如果用户希望这样做)。
调用truncator
时,上述函数运行的表已存在。
答案 0 :(得分:0)
您的代码在这里工作正常:https://jsfiddle.net/dusfqtr9/
$(document).ready(function() {
var btn = document.createElement('button');
btn.setAttribute('content', 'test content');
btn.setAttribute('class', 'show-full-text-button');
btn.innerHTML = 'Show Full Log';
btn.onclick = function() {
alert("Hello !");
};
$("#container").append(btn);
});
也许你的脚本在创建父容器之前运行,所以$(v).append(btn)什么都不做。
答案 1 :(得分:0)
onclick
仅适用于加载脚本(包含onclick处理程序)时已存在的元素。因此,之后创建的元素不再绑定到您在加载的脚本中指定的onclick
事件。
我不确定您的完整代码集是什么,但我猜测在加载脚本后,您的按钮可能会重新生成几次。这是onclick
事件未触发的最可能原因。
因此,你想要做的是将事件处理程序“附加”到DOM树中的更高级别(最高的是你的html),你肯定不会“以编程方式”重新生成,然后你' d想要检查DOM内部存在的元素是否存在。然后在找到此元素时运行您的函数。
下面是使用.on
:
EDIT1:我根据您的最新评论编辑了代码。您会注意到我已经分离了处理按钮点击的功能。我强烈建议您尝试在原始代码集中执行此操作,并且您将看到onclick事件将始终绑定到您的按钮,无论您何时创建按钮,甚至如何很多时候你会重生它们。
EDIT2:我刚刚在评论中注意到您要在警报中显示全文。编辑代码以显示一种方法。
function truncator(){
$.each($('td.rawdata-field').not(':empty'), function(i,v){
var origContent = $(v).text();
$(v).attr('orig-content',origContent);
var count = parseInt($(v).text().length);
var maxChars = 10;
if(count > maxChars){
var str = $(v).text();
var trimmed = str.substr(0, maxChars - 2);
$(v).text(trimmed + '...');
var btn = document.createElement('button');
btn.setAttribute('content', 'test-content');
btn.setAttribute('class', 'show-full-text-button');
btn.innerHTML = 'Show Full Log';
$(v).append(btn);
}
});
};
$('html').on('click', '.show-full-text-button', function(){
content = $(this).closest('td').attr('orig-content');
alert(content);
});
truncator();
table td {
border:1px solid black;
padding:5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<tr>
<td class="rawdata-field"> this is a very long text </td>
<td class="rawdata-field"> another long text </td>
<td class="rawdata-field"> this is getting out ofhand </td>
</tr>
<tr>
<td class="rawdata-field"> okay another longtext </td>
<td class="rawdata-field"> more content here, and there's another one here </td>
<td class="rawdata-field"> what am i doing here </td>
</tr>
</table>