Par*_*roX 8 javascript php jquery protocols header
我使用的应用程序已经创建了自己的协议,就像MS为其MSN客户端所做的那样 msnim:chat?contact=test@test.com
但是,我需要创建一个PHP或javascript(或组合)来基本上尽快向协议发送3个请求.如果最终结果是www.test.com/send.php用户链接<a href='www.test.com/send.php'>不会弹出或重定向到页面,我也想要它
<?php header('Location: msnim:chat?contact=test@test.com'); ?> 用户点击href时不会创建新页面或重定向
这是我的概念证明的JQUERY和JSBin
$(document).ready(function(){
$("a#click_me").click(function(){
setTimeout(function(){
console.log('test ran');
window.location = 'mailto:test@test.com';
}, 100);
setTimeout(function(){
console.log('new ran');
window.location = 'mailto:new@new.com';
}, 200);
});
});
Run Code Online (Sandbox Code Playgroud)
这似乎适用于IE9,据我所知IE8.Firefox 10似乎也可以,但Chrome 17只能发送第一封电子邮件.
编辑1:更新了MSN而不是AIM链接,以便更加通用于测试,并包括jquery示例和JSbin
编辑2:更新到mailto链接
Jos*_*osh 10
以下HTML/JavaScript代码将观察点击<a id="click_me">并创建两个新的iFrame到URL,这可以触发您创建的自定义URI方案:
<html>
<head>
<script type="text/javascript">
$(document).ready(function(){
var imURL = 'http://josh.gitlin.name/9472703.php?id='; // Change this to your URL
function openIM(who) {
var iFrame = '<iframe src="'+imURL+who+'"></iframe>';
$('div#imLinks').append(iFrame);
}
$("a#click_me").click(function(e){
e.preventDefault();
setTimeout(function(){
openIM('1');
}, 100);
setTimeout(function(){
openIM('2');
}, 200);
});
});?
</script>
</head>
<body>
<p>Some content here</p>
<p><a href="#" id="click_me">Click Me!</a></p>
<div id="imLinks"></div>
</body>
</html>?
Run Code Online (Sandbox Code Playgroud)
以下PHP代码将显示在这些iFrame中:
<?php
$screenname = '';
switch($_REQUEST['id']) {
case '1': $screenname = 'firstPerson'; break;
case '2': $screenname = 'secondPerson'; break;
default: $screenname = 'otherPerson'; break;
}
echo <<<END_OF_HTML
<html>
<head>
<meta http-equiv="refresh" content="0;url=aim:goim?screenname=$screenname">
</head>
</html>
END_OF_HTML;
Run Code Online (Sandbox Code Playgroud)
在Safari和Chrome下测试,这将在单击链接时打开多个IM窗口.显然调整到令你满意.
正如BHare指出的那样,"多种弹出式"方法似乎都不适用于最新版本的Chrome.这背后的原因是他们检测到"用户启动的"操作,而不是用不想要的窗口潜在地恶意泛滥用户屏幕.
从本质上讲,Chrome允许您触发每次点击事件不超过一次弹出窗口.click事件也必须是唯一的,因此它不能触发将显示弹出窗口#1的处理程序,传播到父级并触发另一个将显示弹出窗口#2的处理程序.
另一个失败的尝试是通过尝试分发弹出窗口(主页面启动弹出窗口A启动弹出窗口B启动弹出窗口C等) - 这被认为是非用户启动的操作,并且最终只允许一个协议调用.
遗憾的是,此行为不受可编辑策略的控制,即无法通过允许基于原始域的弹出窗口来调整此行为.
根据部署细节(即内联网与互联网),您可以编写Chrome的扩展程序,以便在Chrome级别启动弹出窗口(意味着浏览器镶边,实际上存在于任何单个页面之外和之上的任何内容/样式/脚本) .反过来,您的页面可以检测自定义附加组件的可用性,并将"三重链接"引导到该扩展名,或者提示最终用户安装附加组件.看看你如何无法修改目标协议链接的行为(例如,将指令组合成一个类似于href的单个调用="mailto:first @ email.com,second @ email.com,third @ email.com")这可能是您在此阶段唯一可用的选项.
具体协议链接会很好的工作在客户端没有过要去给服务器; 你可以在运行时添加一个iframe,并设置正确的src.
首先,让我们好好照顾标记.贬低必须手动为点击功能分配网址.我已经完成了第一种有效且有意义的方式(以html验证为代价),但你可以更整洁并使用自定义data-*属性:
<a href="mailto:first@tempinbox.com" href2="mailto:second@tempinbox.com" href3="mailto:third@tempinbox.com">Click me!</a>?
Run Code Online (Sandbox Code Playgroud)
你知道还有什么是贬低的吗?必须手动绑定点击功能 - 这需要花费太多精力.如果有两个这样的锚点怎么办?让我们告诉jQuery将click事件绑定到使用该协议的每个链接:
$('a[href^="mailto:"]').bind("click", function(e){
/*Do stuff*/
});
Run Code Online (Sandbox Code Playgroud)
在我们迭代href~href3属性之前,让我们编写一个函数来处理打开单个mailto链接:
function openMailto(s){
if (s) $("<iframe />", {src:s, class:"mailto-iframe"}).appendTo("body");
}
Run Code Online (Sandbox Code Playgroud)
它检查url是否从非空属性传递,动态创建iframe元素并将属性映射到它,并通过附加到body来"运行"它.
在这里完成:http://jsfiddle.net/uaLVh/ - 额外奖金包括隐藏辅助iframe的一些css以及协议特定链接的样式.是的,我知道我答应迭代href的归因但我刚刚手动完成.
HTML
<a href="#">Don't click me</a><br/>
<a href="mailto:first@tempinbox.com" href2="mailto:second@tempinbox.com" href3="mailto:third@tempinbox.com">Click me!</a>?
Run Code Online (Sandbox Code Playgroud)
CSS
/*prevent these iframes from being visible*/
iframe.mailto-iframe{display:none;}
/*bonus: style your protocol-specific links*/
a[href^="mailto:"] {padding-left:20px;background:url(http://sstatic.net/stackoverflow/img/favicon.ico) no-repeat;}
?
Run Code Online (Sandbox Code Playgroud)
JS
$('a[href^="mailto:"]').bind("click", function(e){
//cache "this" link element jquery reference
$this=$(this);
//remove "helper" iframes if any, you don't want to end up with 300 iframes by accident!
$("iframe.mailto-iframe").remove();
//go wild... you could have a nice loop as you're not limited to 3 hrefs
openMailto($this.attr("href"));
openMailto($this.attr("href2"));
openMailto($this.attr("href3"));
//processing href2 and href3 before allowing the default action to happen firstseemed counter-intuitive
e.preventDefault();
return false;
});
function openMailto(s){
if (s) $("<iframe />", {src:s, class:"mailto-iframe"}).appendTo("body");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |