我有一个加密表单消息的联系表单:
<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
<form name="form_contact" method="post" action="/cgi/formmail.pl">
// other input fields here
<textarea name="message" id="message" required></textarea>
<button id="sendbutton" type="submit">Send</button>
</form>
以下Javascript脚本正常工作,当用户点击发送按钮时,会对表单消息执行操作:
$(document).ready(function() {
$("button[id$='sendbutton']").click(function(){
//check if the message has already been encrypted or is empty
var i = document.form_contact.message.value.indexOf('-----BEGIN PGP MESSAGE-----');
if((i >= 0) || (document.form_contact.message.value === ''))
{
document.form_contact.submit(); return;
}
else
{
document.form_contact.message.value='\n\n'+ document.form_contact.message.value + "\n\n\n\n\n\n\n\n" + "--------------------------" + "\n"
if (typeof(navigator.language) != undefined && typeof(navigator.language) != null) {
document.form_contact.message.value=document.form_contact.message.value + '\n'+ "Language: " + (navigator.language);}
else if (typeof(navigator.browserLanguage) != undefined && typeof(navigator.browserLanguage) != null) {
document.form_contact.message.value=document.form_contact.message.value + '\n'+ "Language: " + (navigator.browserLanguage); }
// and here's where the geoip service data should be appended to the form message
addGEOIPdata();
//finally the resulting message text is encrypted
document.form_contact.message.value='\n\n'+doEncrypt(keyid, keytyp, pubkey, document.form_contact.message.value);
}
});
});
function addGEOIPdata(){
$.get('http://ipinfo.io', function(response)
{
$("#message").val( $("#message").val() + "\n\n" + "IP: "+ response.ip + "\n" + "Location: " + response.city + ", " + response.country);
}, 'jsonp');
};
嗯,它的工作原理除外:它不会在加密之前将Geoip服务ipinfo.io的响应添加到表单消息。
我在其他地方看到了一个jquery JSON调用示例,它将所有代码放在 $ .get(&#39; http://ipinfo.io&#39;中,功能(响应){...})
但那不我想要的东西。
如果ipinfo查询出现问题,那么没有其他可以正常工作 - 正好因为所有内部 $ .get(& #39; http://ipinfo.io&#39;,功能(响应){...})。
换句话说:我如何使我的button.click和我的$ .GET-JSON调用一起工作,这样脚本可以工作但是将它们分开(在button.click之外的JSON),这样如果JSON调用由于某种原因失败了按钮点击功能,其中的所有内容仍然有效吗?
我已经在Javascript中标记了JSON调用的结果应该附加到表单消息的位置。
感谢您的帮助。
<小时/> 修改:
经过10个小时的试验和错误,我最终偶然发现了让它运作的方式:
所以我将geoipinfo查询放入一个单独的脚本中,该脚本在页面加载时获取信息。
$.getJSON("https://freegeoip.net/json/", function (location) {
var results = "\n\n" + "IP: "+ location.ip + "\n" + "Location: " + location.city + ", " + location.region_name + ", " + location.country_name;
window.$geoipinfo = results;
});
然后在我之前发布的另一个脚本中,我将变量$ geoipinfo添加到表单消息中
document.form_contact.message.value=document.form_contact.message.value + §geoipinfo;
似乎$ geoipinfo现在是一个全局变量,因此我可以在函数外部和其他脚本中使用它的内容。
只要它有效,我就不在乎,但也许有人可以告诉我这个解决方案是否符合javascript的规则。
答案 0 :(得分:1)
jQuery API:http://api.jquery.com/jQuery.get/
指定您可以在.always()中放置一个处理程序,无论get成功还是失败,都会调用它。
$.get('http://ipinfo.io', , function(response)
{
$("#message").val( $("#message").val() + "\n\n" + "IP: "+ response.ip + "\n" + "Location: " + response.city + ", " + response.country);
}, 'jsonp').always(function(){
document.form_contact.message.value='\n\n'+doEncrypt(keyid, keytyp, pubkey, document.form_contact.message.value);
});