javascript - 尝试调用位于另一个函数内部的函数

标签 javascript html

我知道这个问题之前已经被问过,但之前的答案都没有帮助我。

这是我的功能:

function execute() {
    console.log('here')
    const q = document.getElementById('myinput').value
    return gapi.client.youtube.search.list({
      "part": "snippet",
      "order": "viewCount",
      "q": q,
      "type": "video",
      "videoDefinition": "high",
      "maxResults": 10
    })
        .then(function(response) {
          console.log("Response", response);
          const z = response.result.items


         console.log("x", z)
          return(z.map(vid => {
            console.log("vid", vid)

            const date = document.createElement('div')
            const title = document.createElement('h2')
            const video = document.createElement('iFrame')


            date.textContent = vid.snippet.publishedAt
            title.textContent = vid.snippet.title



            const x = document.getElementById('results')
            console.log(date)
            x.append(date)
            x.append(title)
            x.append(video)


            const w = document.getElementById('date')
            const v = document.getElementById('view')
            function sorting(){

              const items = vid.childNodes;
              const itemsArr = [];
              for (var i in items) {
                if(items[i].nodeType == 1){
                  itemsArr.push(items[i])
                }
              }
              itemsArr.sort(function(a,b){
                return a.innerHTML === b.innerHTML
                    ? 0
                    : (a.innerHTML > b.innerHTML ? 1 : -1);
              });
              for (i = 0; i < itemsArr.length; ++i){
                w.appendChild(itemsArr[i])
              }
          }
            return(x)


          }))

              },
              function(err) { console.error("Execute error", err); });
  }

我想在我的 onclick 上触发排序功能:<option onclick="execute().sorting()"id = "date">Date</option>

如果您知道我如何调用它,或者即使您知道按日期和观看次数对视频进行排序的更好方法,请留下评论或答案。任何帮助表示赞赏。

哦!我应该补充一点,这必须用纯原生 javascript 来完成。

编辑

您要求提供 HTML:

<button onclick="execute()">Search</button>
<h3>Sort:</h3>
<select>
  <option onclick="execute.b()"id="view" value="viewCount">View Count</option>
  <option  onclick="execute().sorting()"id = "date">Date</option>
</select>

最佳答案

您可以使用嵌套函数创建构造函数sorting启动时范围限定为该对象,然后在 js 中启动它,即:

function Execute() {

this.search = function(){
    console.log('here')
    const q = document.getElementById('myinput').value
    return gapi.client.youtube.search.list({
        "part": "snippet",
        "order": "viewCount",
        "q": q,
        "type": "video",
        "videoDefinition": "high",
        "maxResults": 10
    })
        .then(function(response) {
                console.log("Response", response);
                const z = response.result.items


                console.log("x", z)
                return (z.map(vid => {
                    console.log("vid", vid)

                    const date = document.createElement('div')
                    const title = document.createElement('h2')
                    const video = document.createElement('iFrame')


                    date.textContent = vid.snippet.publishedAt
                    title.textContent = vid.snippet.title



                    const x = document.getElementById('results')
                    console.log(date)
                    x.append(date)
                    x.append(title)
                    x.append(video)


                    const w = document.getElementById('date')
                    const v = document.getElementById('view')

                    this.sorting();
                    return (x)


                }))

            },
            function(err) {
                console.error("Execute error", err);
            });
};

this.sorting = function() {

    const items = vid.childNodes;
    const itemsArr = [];
    for (var i in items) {
        if (items[i].nodeType == 1) {
            itemsArr.push(items[i])
        }
    }
    itemsArr.sort(function(a, b) {
        return a.innerHTML === b.innerHTML ?
            0 :
            (a.innerHTML > b.innerHTML ? 1 : -1);
    });
    for (i = 0; i < itemsArr.length; ++i) {
        w.appendChild(itemsArr[i])
    }
};

}

然后在整个页面加载时创建一个实例:

  var executeInstance;
  window.onload = function(event){
    executeInstance = new Execute();
  };

然后在 HTML 中调用实例(不确定 b 是什么函数,在初始示例中不存在):

<button onclick="executeInstance.search()">Search</button>
<h3>Sort:</h3>
<select>
  <option onclick="executeInstance.b()"id="view" value="viewCount">View Count</option>
  <option  onclick="executeInstance.sorting()"id = "date">Date</option>
</select>

有关对象构造函数的更多信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor

关于javascript - 尝试调用位于另一个函数内部的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59921592/

相关文章:

javascript - 随着时间的推移,firebase 的存在变得越来越错误

javascript - 每个(不同的)类触发一次点击事件

Javascript 无法在服务器上运行

javascript - 为 li 和 ul li 设置不同的 <span> 标签(嵌套)

javascript - 相同功能的不同输出

javascript - colResizable JQuery 插件是否支持多语言或 RTL

javascript - 如果单元格为空,则引用同一行中其他列的另一个单元格

javascript - iPhone Web 应用程序 - 禁用正文滚动但允许正文中的所有元素

html - 媒体查询根本不起作用

javascript - 全部勾选触发点击或改变参数