2017-01-27 11 views
0

私はAptana Studio 3テキストエディタを使用しており、Windows 7 Enterprise OSで作業しています。次のAJAXコードは、ローカルシステム上で動作していないため、httpsウェブサイトに保存されているJSONファイルを取得できません。この例では、Youtubeビデオから取られる:Chrome、Firefox、Internet ExplorerでXMLHttpRequest.onReadyStateChangeが機能しない

JSON and AJAX Tutorial: With Real Examples

のindex.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
     <meta name="test" content="content"/> 
     <title>JSON and AJAX</title></head> 
<header> 
    <h1>JSON and AJAX</h1> 
    <link rel="stylesheet" href="styles.css" type="text/css" media="screen" title="no title" charset="utf-8"/> 
</header> 


<body> 
<script src="main.js"></script> 
<button type="button" onclick="function()" id="btn">Fetch Info for 3 New Animals</button> 
<div id="animal-info"> </div> 
</body> 

</html> 

をStyles.cssを:

html, body { 
    padding: 0; 
    margin: 0; 
} 

.hide-me { 
    visibility: hidden; 
    opacity: 0; 
    transform: scale(.75); 
} 

h1 { 
    margin-top: 0; 
    font-size: 2.4em; 
    font-weight: normal; 
    display: inline-block; 
} 

body { 
    font-family: Helvetica, sans-serif; 
    padding: 50px 10%; 
} 

button { 
    background-color: #046380; 
    color: #FFF; 
    border: none; 
    padding: 10px 15px; 
    font-size: 15px; 
    border-radius: 4px; 
    cursor: pointer; 
    outline: none; 
    box-shadow: 2px 2px 0 #034154; 
    margin-bottom: 10px; 
    margin-left: 18px; 
    transition: opacity .4s ease-out, transform .4s ease-out, visibility .4s ease-out; 
    position: relative; 
    top: -10px; 
} 

button:hover { 
    background-color: #034F66; 
} 

button:active { 
    background-color: #034154; 
    box-shadow: none; 
    position: relative; 
    top: -8px; 
    left: 2px; 
} 

p { 
    padding: 4px 0 2px 8px; 
    line-height: 1.7; 
    border-bottom: 1px dotted #DDD; 
    list-style: none; 
    margin: 0; 
} 

main.js:

var pageCounter = 1; 
var animalContainer = document.getElementById("animal-info"); 
var btn = document.getElementById("btn"); 

btn.addEventListener("onClick", function() { 
    var ourRequest = new XMLHttpRequest(); 
    ourRequest.open("GET", "https://learnwebcode.github.io/json-example/animals-" + pageCounter + ".json"); 
    //ourRequest.open('GET', 'animals-' + pageCounter + '.json'); 
    ourRequest.onload = function() { 
    if (ourRequest.status >= 200 && ourRequest.status < 400) { 
     var ourData = JSON.parse(ourRequest.responseText); 
     renderHTML(ourData); 
    } else { 
     console.log("We connected to the server, but it returned an error."); 
    } 

    }; 

    ourRequest.onerror = function() { 
    console.log("Connection error"); 
    }; 

    ourRequest.send(); 
    pageCounter++; 
    if (pageCounter > 3) { 
    btn.classList.add("hide-me"); 
    } 
} 
); 


function renderHTML(data) { 
    var htmlString = ""; 

    for (i = 0; i < data.length; i++) { 
    htmlString += "<p>" + data[i].name + " is a " + data[i].species + " that likes to eat "; 

    for (ii = 0; ii < data[i].foods.likes.length; ii++) { 
     if (ii == 0) { 
     htmlString += data[i].foods.likes[ii]; 
     } else { 
     htmlString += " and " + data[i].foods.likes[ii]; 
     } 
    } 

    htmlString += ' and dislikes '; 

    for (ii = 0; ii < data[i].foods.dislikes.length; ii++) { 
     if (ii == 0) { 
     htmlString += data[i].foods.dislikes[ii]; 
     } else { 
     htmlString += " and " + data[i].foods.dislikes[ii]; 
     } 
    } 

    htmlString += '.</p>'; 

    } 

    animalContainer.insertAdjacentHTML('beforeend', htmlString); 
} 

このコードはローカルマシンでは動作しません。ローカルマシンにNodeJsを使ってhttpサーバをインストールしてみましたが、まだ喜んでいません!

ww3Schools.com

上の別のJSON AJAXコードはかかわらず、正常に動作するようです。これはhtmlファイルのインラインJavaScriptコードです。当初、私はonReadyStateChangeがIE、FF、CHなどで動作していない犯人だと考えましたが、このWebサイトのコードにもonReadyStateChangeがありますが、正常に動作します!

ボタンのクリックイベントハンドラが原因で動作しないのはなぜですか?

btn.addEventListener("onClick", function() { 

私のコードはインラインではありません、その理由がありますか?そうでない場合、何が欠けているのか、間違っているのですか?

答えて

0

私は "スクリプト" タグの上に "DIV" を移動することでhtmlファイルを変更:

のindex.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta name="test" content="content"/> 
     <title>JSON and AJAX</title></head> 
<header> 
    <h1>JSON and AJAX</h1> 
    <link rel="stylesheet" href="styles.css" type="text/css" media="screen" title="no title" charset="utf-8"/> 
<button type="button" onclick="function()" id="btn">Fetch Elements</button> 
<div id="animal-info"> </div> 
</header> 

<body> 
<script src="main.js"></script> 
</body> 

</html> 

main.js:

var pageCounter = 1; 
var animalContainer = document.getElementById("animal-info"); 
var btn = document.getElementById("btn"); 

    btn.addEventListener("click", function() { 
    // function LoadJSON() { 
     if (window.XMLHttpRequest) { 
     // code for modern browsers 
     var ourRequest = new XMLHttpRequest(); 
     } else { 
     //code for IE6, IE5 
     var ourRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

     // ourRequest.onLoad = function() {  
     ourRequest.onreadystatechange = function() { 
      if (this.readyState = 4 && (this.status >= 200 && this.status < 400)) { 
      var ourData = JSON.parse(ourRequest.responseText); 
      renderHTML(ourData); 
      } else { 
      console.log("We connected to the server, but it returned an error."); 
      } 
     }; 

     ourRequest.open("GET", "https://learnwebcode.github.io/json-example/animals-" + pageCounter + ".json"); 
     // ourRequest.open('GET', 'animals-' + pageCounter + '.json'); 
     ourRequest.send(); 

     ourRequest.onerror = function() { 
     console.log("Connection error"); 
     }; 

     pageCounter++; 
     if (pageCounter > 3) { 
     btn.classList.add("hide-me"); 
     } 
    } 
); 

function renderHTML(data) { 
    var htmlString = ""; 
    for (i = 0; i < data.length; i++) { 
     htmlString += "<p>" + data[i].name + " is a " + data[i].species + " that likes to eat "; 

      for (ii = 0; ii < data[i].foods.likes.length; ii++) { 
       if (ii == 0) { 
       htmlString += data[i].foods.likes[ii]; 
       } else { 
       htmlString += " and " + data[i].foods.likes[ii]; 
       } 
      } 
      htmlString += ' and dislikes '; 

      for (ii = 0; ii < data[i].foods.dislikes.length; ii++) { 
       if (ii == 0) { 
       htmlString += data[i].foods.dislikes[ii]; 
       } else { 
       htmlString += " and " + data[i].foods.dislikes[ii]; 
       } 
      } 
      htmlString += '.</p>'; 
     } 
     // animalContainer.insertAdjacentHTML('beforeend', htmlString); 
     animalContainer.innerHTML=htmlString; 
} 

これを今すぐ働きます!

私が直面している唯一の問題は、サーバー上でjsonファイルが増えた場合、どのボタンをクリックしたときに処理されたjsonファイルの数に基づいてボタンを非表示にするか(hide-me)時間? pageCounterは、私は、それが2回JSONを表示する「insertAdjacentHTML」を有効にした場合、私が見る他の問題がある3.

 if (pageCounter > 3) { 
    btn.classList.add("hide-me"); 
    } 

超える場合

は今のところ、それはボタンが非表示になります。なぜこうなった?

// animalContainer.insertAdjacentHTML('beforeend', htmlString); 
0

使用この:

btn.style.visibility = "隠されました";

関連する問題