javascript - DOM createElement() 动态地与点击事件到 div 特定的 url 元素
问题描述
我正在尝试构建一个动态包含有关商店分支位置信息的 9 个 div(卡片)。每张卡片都有一个与之关联的唯一 URL,该 URL 链接到每个分支的特定 URL。
这种方法在函数中将第一个 (0) URL 附加到所有卡片:
$("div").click(function() {
window.location = $(this).find("a").attr("href");
return false;
});
这种方法将最后一个 URL (8) 附加到所有卡片:
branch.addEventListener("click", function(e){
e.preventDefault();
window.open(prop.pages_url);
})
我正在使用的代码:
function buildLocationList(data) {
for (i = 0; i < 9; i++) {
var currentFeature = data.features[i];
var prop = currentFeature.properties;
//Create Card
var branches = document.getElementById('branches');
var url = branches.appendChild(document.createElement('a');
url.setAttribute('href', prop.pages_url);
)
var branch = branches.appendChild(document.createElement('div'));
branch.className = 'card';
branch.id = "branch-" + i;
branch.url = prop.pages_url;
branch.addEventListener("click", function(e){
e.preventDefault();
window.open(prop.pages_url);
})
//Append Branch Card Details
v
var company = branch.appendChild(document.createElement('h5'));
company.innerHTML = prop.name + '<br />';
var distancePhone = branch.appendChild(document.createElement('p'));
if (prop.distance) {
var roundedDistance = Math.round(prop.distance * 100) / 100;
distancePhone.innerHTML = '<span class="miles">Approx. ' + roundedDistance + ' miles</span>' + '<span class="location-phone">' + prop.phone_number + '</span>';
}
else {
distancePhone.innerHTML = prop.phone_number;
}
var address = branch.appendChild(document.createElement('p'));
if (prop.address_line_2) {
address.innerHTML += prop.address_line_1 + ', ' + prop.address_line_2 + '<br />';
}
else {
address.innerHTML += prop.address_line_1 + '<br />';
};
address.innerHTML += prop.address_city + ', ' + prop.address_state + ' ' +prop.address_postal_code + '</p>';
}
}
我希望卡片可以通过重定向到每个分支的唯一 URL 来点击。
解决方案
您将 URL 存储在 card 元素上:
branch.url = prop.pages_url
在点击处理程序中您需要做的就是访问该属性:
branch.addEventListener("click", function(e){
e.preventDefault();
window.open(e.currentTarget.url);
})
在事件处理程序的上下文中,e.currentTarget
是处理程序附加到的元素。如果您对触发事件的元素感兴趣,您可以使用e.target
.
这是您在下面修改的代码片段。由于沙盒 iframe,我认为链接不会在此处打开。
function buildLocationList(data) {
for (i = 0; i < data.features.length; i++) {
var currentFeature = data.features[i];
var prop = currentFeature.properties;
//Create Card
var branches = document.getElementById('branches');
var url = branches.appendChild(document.createElement('a'));
url.setAttribute('href', prop.pages_url);
var branch = branches.appendChild(document.createElement('div'));
branch.className = 'card';
branch.id = "branch-" + i;
branch.url = prop.pages_url;
branch.addEventListener("click", function(e){
e.preventDefault();
console.log(e.currentTarget.url);
window.open(e.currentTarget.url);
})
//Append Branch Card Details
var company = branch.appendChild(document.createElement('h5'));
company.innerHTML = prop.name + '<br />';
var distancePhone = branch.appendChild(document.createElement('p'));
if (prop.distance) {
var roundedDistance = Math.round(prop.distance * 100) / 100;
distancePhone.innerHTML = '<span class="miles">Approx. ' + roundedDistance + ' miles</span>' + '<span class="location-phone">' + prop.phone_number + '</span>';
}
else {
distancePhone.innerHTML = prop.phone_number;
}
var address = branch.appendChild(document.createElement('p'));
if (prop.address_line_2) {
address.innerHTML += prop.address_line_1 + ', ' + prop.address_line_2 + '<br />';
}
else {
address.innerHTML += prop.address_line_1 + '<br />';
};
address.innerHTML += prop.address_city + ', ' + prop.address_state + ' ' +prop.address_postal_code + '</p>';
}
}
buildLocationList({features:[{
properties: {
distance: 100,
name: 'Google',
pages_url: 'https://www.google.com',
phone_number: '123-456-7890',
address_line_1: '1234 Street',
address_city: 'Citytown',
address_state: 'State',
address_postal_code: '12345'
}
},{
properties: {
distance: 200,
name: 'Microsoft',
pages_url: 'https://www.microsoft.com',
phone_number: '123-456-7890',
address_line_1: '1234 Street',
address_city: 'Citytown',
address_state: 'State',
address_postal_code: '12345'
}
}]})
.card {
border: 1px solid #ccc;
padding: 10px;
max-width: 50%;
margin: 10px;
}
<div id="branches"></div>
推荐阅读
- r - 提取R中两个符号之间的子字符串
- c++ - 类过程中的 OpenGL 空白屏幕
- r - 将 geom_point 更改为渐变填充形状/多边形
- security - 检测到请求获取我的网络服务器的假用户代理(又名刮板)?
- aws-lambda - Serilog CloudWatchSink 不适用于 Lambda 函数
- javascript - regex to mask phone number such that except first 2 and last 2 characters in a number are replaced with * in javascript
- jmeter - Opco 的 Jmeter 脚本
- apache-spark - 根据另一个表spark sql计算每一行
- ejs - 如何阻止 csslint 和 jshint 在 Atom 中对我的 EJS 进行 linting?
- openstack - Openstack HEAT:通过 HEAT 模板手动将新实例添加到现有堆栈