Javascript 在防止违约后,实际执行违约
我想阻止链接的默认行为(Javascript 在防止违约后,实际执行违约,javascript,html,Javascript,Html,我想阻止链接的默认行为(a),然后执行默认行为,比如在新窗口中打开链接 以下是一些HTML代码: <a href="somewhere" target="_blank" id="mylink"> 我知道我可以做这样的事情: window.open(e.target.href); 但是这不是一个选项,因为浏览器认为这是一个弹出窗口。我不想在JS中重写一些东西,只是考虑一下链接:这个链接必须执行它的默认行为(这是被阻止的)。 有办法做到这一点吗?以下是一些想法: var openin
a
),然后执行默认行为,比如在新窗口中打开链接
以下是一些HTML代码:
<a href="somewhere" target="_blank" id="mylink">
我知道我可以做这样的事情:
window.open(e.target.href);
<>但是这不是一个选项,因为浏览器认为这是一个弹出窗口。我不想在JS中重写一些东西,只是考虑一下链接:这个链接必须执行它的默认行为(这是被阻止的)。
有办法做到这一点吗?以下是一些想法:
var openingPopup = false;
document.getElementById('mylink').addEventListener('click', function (e) {
if(!openingPopup){
e.preventDefault();
axios.post('options', new FormData(document.querySelector('#myform')))
.then(function(){
// make sure this would not run twice
openingPopup = true;
document.getElementById('mylink').click();
});
}else{
// skipping this only for one time
openingPopup = false;
}
});
这样,
根据@Electrox Qui Mortem的建议链接,完成预处理后,您可以删除事件侦听器并再次调用click (相关MDN链接:)
const-anchor=document.getElementById('anchor');
anchor.addEventListener(“单击”,测试);
功能测试(e){
e、 预防默认值();
警报(“测试”);
如果(真){
console.log(this);
此.removeEventListener('click',test');
这个。单击();
}
}
以一种更“本机”的方式,您可以创建一个新的不可取消的“单击”事件,并针对同一元素触发它
var-anchor=document.querySelector(“#目标”);
函数触发器单击(目标){
var newClick=newmouseevent('click'{
视图:窗口,
泡泡:是的,
可取消:false
});
target.dispatchEvent(newClick);
}
anchor.addEventListener('click',函数(e){
e、 预防默认值();
如果(例如,防止违约){
警惕(‘防止’);
触发点击(锚定);
}
否则{
警报(“未阻止”);
}
});代码>
关于window.location=somewhere
?您可以通过设置并检查标志来重新触发链接的单击事件。@道格:不,这不是HTML应该做的:HTML(如果默认设置未被阻止)应该在新窗口中打开链接可能的重复内容似乎有点像问题?如果假设在ajax事件成功(数据可用)之前不执行链接,那么该链接可能不是触发请求的起始位置。您的ajax调用似乎没有使用链接中的任何内容,也没有任何内容阻止在加载页面时进行ajax调用,从而启用或禁用链接。您似乎也在尝试解决用户偏好问题。正如您自己所说的那样,windows.open
可以工作,但前提是它没有打开弹出窗口,…这是用户的首选项。好的,谢谢您的回答。它并不例外:它被认为是一个不需要的弹出窗口。因此,它的行为不同:链接(不带JS)在没有浏览器提示弹出窗口的情况下工作,但在触发单击时,它被视为不需要的弹出窗口。(不确定我是否完全清楚)@rap-2-h这应该被认为是一个不需要的弹出窗口-如果不是,那么阴暗的广告商会用同样的方法让他们的弹出窗口通过你的弹出窗口拦截器。谢谢你,它是有效的,但是如果我的triggerClick函数在回调中,它就不起作用了(就像我的问题一样)。它显示一个弹出信息(弹出被阻止,blabla)@rap-2-h您确定您没有做其他可能干扰回调的事情吗?我尝试了一个HTTP请求,它似乎适合我。
var openingPopup = false;
document.getElementById('mylink').addEventListener('click', function (e) {
if(!openingPopup){
e.preventDefault();
axios.post('options', new FormData(document.querySelector('#myform')))
.then(function(){
// make sure this would not run twice
openingPopup = true;
document.getElementById('mylink').click();
});
}else{
// skipping this only for one time
openingPopup = false;
}
});