2015-04-18 2 views
1

В сценарии, который я написал, есть кнопка, которая при щелчке должна показывать год и IP-адрес, но она выполняется автоматически. Я видел в другом 3D, что эта проблема возникает, когда в «OnClick» вариант вы поставите функцию какБез котировок функция OnClick вызывается автоматически

<button name="bottone" onclick=myFunction()>AH-AH</button> 

, но это не мой случай.

<button name="bottone" onclick=myFunction>AH-AH</button> 

<p id="demo"></p> 

<script> 
function myFunction(json) { 
    var d = new Date(); 
    var n = d.getFullYear(); 
    var ip = json.ip; 
    document.getElementById("demo").innerHTML = n + ' ' + ip; 
} 
</script> 

<script type="application/javascript" src="http://jsonip.appspot.com/?callback=myFunction"></script> 

Кажется, что второй скрипт «переопределяет» опцию onClick.

+0

Не совсем ясно, что происходит, кнопка не работает или функция вызывается, даже если не нажать? –

+0

Привет, ураймо, извините за мое плохое объяснение и плохое владение языком. Функция вызывается, даже если я не нажимаю. – Kernel

+0

Итак, проверьте мой ответ, этот скрипт на jsonip.appspot.com вызывает вашу функцию явно, когда вы закончите загрузку этого скрипта, он вызывает вашу функцию. –

ответ

2

Сценарий вызывает ваши функции сразу:

myFunction({"ip": "88.9.35.40", "address":"88.9.35.40"}); 

Вместо этого, вы можете хранить данные в переменной и использовать эту переменную в обработчике событий:

<button name="bottone">Display year and IP</button> 
 
<p id="demo"></p> 
 
<script> 
 
(function() { 
 
    var ipData; 
 
    window.getIpData = function(data) { // We must use awful global for JSONP 
 
    delete window.getIpData; // Get rid of the awful global 
 
    ipData = data; 
 
    }; 
 
    document.getElementsByName('bottone')[0].onclick = function() { 
 
    if(ipData) { 
 
     var year = new Date().getFullYear(), 
 
      ip = ipData.ip; 
 
     document.getElementById("demo").innerHTML = year + ' ' + ip; 
 
    } 
 
    } 
 
})(); 
 
</script> 
 
<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getIpData"></script>

+0

Привет Ориол, спасибо за ваш ответ. Код работает! Я должен задать вам несколько вопросов: 1-й : почему вы бросите все содержимое скрипта в скобках? Я имею в виду (... code ...)(); 2nd: window - объект, подобный документу, который может быть вызван без какого-либо конструктора? И вы создали поле window.getIpData, выполняющее задание? 3rd: ipData - это особый тип, или, как указано выше, вы определили его поле ip? я надеюсь, что я не был кощунственно и извините за мой бедный Инглезе. – Kernel

+0

@ user4804285 Может быть, мой [первый править] (http://stackoverflow.com/posts/29716665/revisions#revb2d0555e-de8b-48f5-af2f-b228e3a9adfd) было немного проще. Я использую функцию самоисполнения ('(function() {/ * code * /})()' для предотвращения того, что ipData' является глобальным. 'Window' - глобальный объект. функции, я определяю 'getIpData' в' window', и я удаляю его, как только он был использован. 'ipData' - это переменная, которая может иметь значение любого типа (объекты, числа, строки. ..), в этом случае оно будет определено на начальном этапе, а затем объект. – Oriol

+0

спасибо большое за объяснений! – Kernel

2
  1. Изменить что OnClick для onclick="myFunction()", что, как это должно быть (всегда использовать кавычки, это вызов функции так включают круглые скобки).

  2. Этот второй сценарий вызывает непосредственно функцию вы передаете в качестве параметра обратного вызова ?callback=myFunction, поэтому он будет вызывать автономно ваш myFunction().

Try открытие that script url прямо в вашем браузере, чтобы увидеть, что будет выполнять сценарий:

myFunction({"ip": "11.11.11.81", "address":"11.11.11.81"}); 
+0

Привет, я положил кавычки и скобки на onClick, но ничего не работает. Я открыл сценарий в своем браузере и получил ответ вроде вашего. Так? Спасибо за помощь. – Kernel

+0

Цитаты и скобки - это правильное форматирование, которое не предназначено для исправления. Ваша функция вызывается, потому что вызов вашей функции - это единственное, что делает скрипт, если вам это не нужно, вы должны удалить ее. –

+0

Если вы итальянский, Quello script da jsonip.appspot.com semplicemente ricava l'ip del client, scrive una riga di javascript che invoca la tua funzione e la invoca, non fa altro. Quello che vedi aprendo nel browser è il codice che verrà eseguito. –

0

Используйте этот кусок кода. Сценарий u включил, вызывал функцию обратного вызова, и внутри, что он печатал Date и Ip onload на странице. Итак, я сохранил отображение ip и кода даты в отдельной функции.

Переменная, которая используется для отображения даты и Ip> Я сделал их глобальными, поэтому эту переменную можно использовать вне метода обратного вызова.

<button name="bottone" onclick="showIpNDate()">AH-AH</button> 
 
    
 
    <p id="demo"></p> 
 
    
 
    <script> 
 
     var ip, n; 
 
    
 
     function myFunction(json) { 
 
      var d = new Date(); 
 
      n = d.getFullYear(); 
 
      ip = json.ip; 
 
    
 
     } 
 
    
 
     function showIpNDate() { 
 
      document.getElementById("demo").innerHTML = n + ' ' + ip; 
 
     } 
 
    </script> 
 
    
 
    <script type="application/javascript" src="http://jsonip.appspot.com/?callback=myFunction"></script>

+0

Ankuli Привет, спасибо за ваш ответ. код по-прежнему не работает, но я обнаружил, что есть шанс ставить «глобальные» переменные в нескольких функций и сценариев. Спасибо за вашу помощь! – Kernel

+0

@ user4804285 U уверен. он не работает. Но я не вижу каких-либо ошибок во время работы над кодом. – Ankuli

Смежные вопросы