使用 JavaScript 设置 <a> 的点击
Set onclick of <a> using JavaScript
我想更改div中的所有链接,使它们不再引用页面,而是在单击时运行JavaScript函数。为此,我编写了这个函数:
function buildPageInDiv(htmlString){
console.log(typeof htmlString);
$div = $(htmlString).children("div#myDiv");
$div.children("a").each(function(i, element){toJavascriptLinks(element)});
document.getElementById("targetDiv").innerHTML = $div[0].innerHTML;
}
调用此函数:
function toJavascriptLinks(element){
element.href="#";
element.onclick = function(){console.log('Yeah!')};
console.log(element);
}
现在,当我运行 buildPageInDiv
时,控制台上打印了"字符串",所有"href"都更改为"#",并且对于div 中的每个<a>
,控制台都会打印元素:
<a href="#">
这里没有onclick
的迹象,单击该链接不会在控制台上显示任何内容。
我在这里错过了什么?
编辑:
我找错了地方。问题是我在将内部HTML附加到targetDiv
之前运行了toJavascriptLinks(element)
。这对于 href 属性来说没有问题,但对于 onclick
属性来说却是问题。解决方案只是先将其放入targetDiv
,然后在targetDiv
上运行toJavascriptLinks(element)
:
function buildPageInDiv(htmlString){
console.log(typeof htmlString);
var content = $(htmlString).children("div#myDiv")[0].innerHTML;
document.getElementById("targetDiv").innerHTML = content;
$("div#targetDiv").children("a").each(function(i, element) toJavascriptLinks(element)});
}
虽然问题不在我最初发布的代码中,但下面的综合答案引导我找到了解决方案。
首先:jQuery中所有类型的选择器,以美元符号和括号开头:$()
其次:您需要用;
结束您的陈述最后:在调用函数之前定义函数是一种很好的做法,而不是依靠 JavaScript 将它们提升到顶部。这也将使jslint验证,而相反则不会!
因此,没有错误的代码将如下所示:
function toJavascriptLinks(element){
element.href="#";
element.onclick = function(){alert('Yeah!');};
console.log(element);
}
$('div').children("a").each(function(i, element){toJavascriptLinks(element);});
请参阅此小提琴以获取工作演示。
祝你好运!!
关于您更新的问题:
这是对你问题的更新。
您在控制台中看不到 onclick.log因为您在 dom 中设置了 onclick 事件。如果您想在控制台.log中看到 onclick,您可以使用以下方法添加函数 STRING:
element.setAttribute('onclick', 'your function string');
假设在你的 html 中有:
<a id="link_a" href="http://www.google.com">link 1</a>
<a id="link_b" href="http://www.duckduckgo.com">link 2</a>
你有这个javascript:
var lnkA=document.getElementById("link_a");
var lnkB=document.getElementById("link_b");
lnkA.onclick=function(){alert(this.innerHTML);};
lnkB.setAttribute('onclick','alert(this.innerHTML);');
console.log(lnkA.outerHTML);
console.log(lnkB.outerHTML);
然后控制台.log将包含:
<a id="link_a" href="http://www.google.com">link 1</a>
<a onclick="alert(this.innerHTML);" id="link_b" href="http://www.duckduckgo.com">link 2</a>
有关此解释的现场示例,请参阅此小提琴。
我也认为你已经在使用某种形式的jQuery(在不知情的情况下),因为你使用了.children("div#myDiv")
。据我所知,这不是普通的 javascript。而且我认为普通的javascript和jQuery都不会从纯html字符串中选择id为"myDiv"的div,因此更新中的代码将无法完成这项工作。
最后,为了调整我对你更新的问题的回答和对onclick事件在解析的html源代码中可见的期望:
var htmlString='<div id="myDiv"><a href="http://www.google.com">link 1</a><a href="http://www.duckduckgo.com">link 2</a></div><div id="otherDiv"><a href="http://www.asdf.com">link 3</a><a href="http://www.yahoo.com">link 4</a></div>';
function toJavascriptLinks(element){
element.href="#";
element.setAttribute('onclick','console.log("Yeah!");');
console.log(element.outerHTML);
}
//no innerHTML on documentFragment allowed, yet on it's children it's allowed
var frag = document.createDocumentFragment().appendChild( document.createElement('div') );
frag.innerHTML=htmlString;
var $div = $(frag).children('div#myDiv');
$($div).children("a").each(function(i, element){toJavascriptLinks(element);});
var outp=document.getElementById("output");
outp.innerHTML=frag.innerHTML;
请参阅此更新的小提琴以查看其实际操作。
这就留下了一个问题:你到底为什么要在你的变量名称前面放置"忍者"$符号?
这就是调试器显示 HTML 元素的方式。它不显示所有属性 - 特别是因为您将 DOM 属性onclick
设置为函数引用,该函数引用不能显示为接受字符串的 HTML 属性onclick
(
请尝试console.log(element.onclick);
,它应该显示类似 function() {...}
的内容。
还是事件句柄不起作用?
顺便说一句,您不使用jQuery来设置href和处理程序的原因是什么?
$div.children("a").attr('href', '#').click(function(){console.log('Yeah!')});
还有一件事:在大多数控制台中,您可以单击<a href="#">
,它将显示 DOM 属性,其中应包括事件处理程序。
我真的会为此使用jQuery,这很简单。
$(function() {
$("div > a ").attr("href", "#").click(function(e) {
e.preventDefault();
doSomething();
});
});
var doSomething = function() {
alert("Woah, it works!");
}
请参阅以下 jsfiddle 以了解它的实际操作: http://jsfiddle.net/SsXtt/1/
你确定元素是正确的吗?这对我有用。
<a id="mylink">Test</a>
<script>
document.getElementById("mylink").onclick = function() {
alert("Works");
};
</script>
函数需要在字符串内,尝试添加引号?
- Javascript:使用绝对路径设置img src
- Javascript使用变量设置属性
- 使用Javascript使用数组检查文本框中的值
- Javascript:使用document.write时删除子项
- Javascript 使用 document.write 编写 innerHtml 的值
- JavaScript使用字符串Reveal Triangles
- Javascript:使用用户输入搜索数组
- 使用javascript使用for循环声明变量
- 如何使用Javascript使用给定的输入创建输出表
- Javascript-使用“”将toDateStringMonth从文本字符串解析为数字字符串;如果“;vs“;开关”;
- Javascript使用+添加对象
- Jquery/Javascript使用IF/ELSE语句更改img SRC
- Javascript使用Confirm取消表单提交
- javascript使用正则表达式得到错误的结果
- 对javascript使用.html中的select id
- JavaScript-使用B.prototype=new A()继承数组
- Javascript:使用一个预先存在的对象值作为一个新对象的键
- Javascript使用本地存储,回调对象并用Json更改为一个字符串以用于填充函数
- Javascript使用JCanvaScript在画布中加载图像
- 模型中的Javascript使用列表