0

我有一个加密表单消息的联系表:

<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(' http://ipinfo.io ', function(response){...}) 中,但这不是我想要的。
如果 ipinfo 查询出现问题,那么其他任何方法都不会起作用 - 正是因为它都在里面$.get(' http://ipinfo.io ', function(response){...}) 中。

换句话说:我怎样才能使我的 button.click 和我的 $.GET-JSON 调用一起工作,以便脚本可以工作但将它们分开(JSON 外部 button.click),这样如果 JSON 调用由于某种原因失败,则单击按钮功能和其中的一切仍然有效?

我已经在 J​​avascript 中标记了 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 的规则。

4

1 回答 1

1

The jQuery API: http://api.jquery.com/jQuery.get/

specifies that you can put a handler in .always() and it will be called whether the get succeeds or fails.

$.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);
    });
于 2013-08-19T23:02:00.060 回答