javascript - mediawiki api 无法显示数组的结果

标签 javascript json

大家好,我正在尝试构建 JavaScript 文件,以根据输入字段中的搜索值从维基百科中提取信息,然后使用标题之类的链接显示结果,以便用户可以单击该链接并阅读它。到目前为止,我从 Mediawiki(维基百科)获取了(JSON)格式的请求信息,但无法将其显示在页面上。我认为 JavaScript 数组后面有一个错误代码。 我是 JavaScript 新手,任何帮助或提示将不胜感激。 抱歉,我的脚本很困惑,但我正在尝试很多。 谢谢。

            var httpRequest = false ;
        var wikiReport;


        function getRequestObject() {
            try {
                httpRequest = new XMLHttpRequest();
            } catch (requestError) {
                return false;
            }
            return httpRequest;
        }

        function getWiki(evt) {
            if (evt.preventDefault) {
                evt.preventDefault();
            } else {
                evt.returnValue = false;
            }
        var search = document.getElementsByTagName("input")[0].value;//("search").value;
            if (!httpRequest) {
                httpRequest = getRequestObject();
            }
            httpRequest.abort();
            httpRequest.open("GET", "https://en.wikipedia.org/w/api.php?action=query&format=json&gsrlimit=3&generator=search&origin=*&gsrsearch=" + search , true);//("get", "StockCheck.php?t=" + entry, true);
            //httpRequest.send();
            httpRequest.send();
            httpRequest.onreadystatechange = displayData;
        }

        function displayData() {
        if(httpRequest.readyState === 4 && httpRequest.status === 200) {
            wikiReport = JSON.parse(httpRequest.responseText);//for sunchronus request
            //wikiReport = httpRequest.responseText;//for asynchronus request and response
            //var wikiReport = httpRequest.responseXML;//processing XML data
            var info = wikiReport.query;
            var articleWiki = document.getElementsByTagName("article")[0];//creating the div array for displaying the results
            var articleW = document.getElementById("results")[0];
        for(var i = 0; i < info.length; i++)
        {

    var testDiv = document.createElement("results");
    testDiv.append("<p><a href='https://en.wikipedia.org/?curid=" + query.pages[i].pageid + "' target='_blank'>" + query.info[i].title + "</a></p>");
    testDiv.appendChild("<p><a href='https://en.wikipedia.org/?curid=" + query.info[i].pageid + "' target='_blank'>" + query.info[i].title + "</a></p>");

        var newDiv = document.createElement("div");
        var head = document.createDocumentFragment();
        var newP1 = document.createElement("p");
        var newP2 = document.createElement("p");
        var newA = document.createElement("a");

        head.appendChild(newP1);

        newA.innerHTML = info[i].pages;
        newA.setAttribute("href", info[i].pages);
        newP1.appendChild(newA);
        newP1.className = "head";
        newP2.innerHTML = info[i].title;
        newP2.className = "url";
        newDiv.appendChild(head);
        newDiv.appendChild(newP2);

        articleWiki.appendChild(newDiv);
        }
        }
        }

        //
        function createEventListener(){
        var form = document.getElementsByTagName("form")[0];
        if (form.addEventListener) {
            form.addEventListener("submit", getWiki, false);
        } else if (form.attachEvent) {
            form.attachEvent("onsubmit", getWiki);
        }
        }

        //createEventListener when the page load
        if (window.addEventListener) {
        window.addEventListener("load", createEventListener, false);
        } else if (window.attachEvent) {
        window.attachEvent("onload", createEventListener);
        }

Mediawiki API 链接

https://en.wikipedia.org/w/api.php?action=query&format=json&gsrlimit=3&generator=search&origin= *&gsr搜索=

最佳答案

有些观点你错了。 1) var ArticleW = document.getElementById("结果")[0];

这是错误的。这将返回一个元素,该元素是对 Element 对象的引用,如果具有指定 ID 的元素不在文档中,则返回 null。文档在这里 ( https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById )

正确答案应该是: var ArticleW = document.getElementById("结果");

2)

var info = wikiReport.query;
for(var i = 0; i < info.length; i++) {}
  • info 是 object 。它不是 array ,您不能 for 循环来获取子值。
  • wikiReport.query 不是正确的 wiki 数据。正确的数据应该是 wikiReport.query.pages。并使用for-in循环获取子元素

正确答案:

var pages = wikiReport.query.pages
for(var key in pages) {
    var el = pages[key];
}

3)这也是不正确的

testDiv.appendChild("<p><a href='https://en.wikipedia.org/?curid=" + query.info[i].pageid + "' target='_blank'>" + query.info[i].title + "</a></p>");

Node.appendChild() 方法将一个节点添加到指定父节点的子节点列表的末尾。您正在使用该方法添加字符串。这会导致错误。将其更改为节点元素或使用 append 方法代替

我已经创建了一个示例测试。您可以通过下面的链接查看它 https://codepen.io/anon/pen/XRjOQQ?editors=1011

关于javascript - mediawiki api 无法显示数组的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43601568/

相关文章:

javascript - JSON.stringify(objExtraParam) 给出错误的日期

javascript - XXXXXX.XX 格式数字的正则表达式

javascript - 迭代 JSON 时 NG-repeat 不起作用

javascript - 使用 d3 选择 svg 子元素时遇到问题

python - 将 plot.ly JSON 保存到文件

javascript - 在js中创建嵌套Json

javascript - String.concat 是否比连接字符串的 Array 方法慢

javascript - API JSON 使用数字

php - Paypal 请求不断收到 MALFORMED_REQUEST

json - 无法将数据转换为 NSDictionary