微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何使用 tumblr tweets.js 文件将我的推文与附加图片一起嵌入?

如何解决我如何使用 tumblr tweets.js 文件将我的推文与附加图片一起嵌入?

我对 javascript 一点也不擅长,但我正在编写一个 tumblr 博客 并使用他们集成的 javascript 来显示我的最新推文:tumblr 自动为我的 twitter acc 生成脚本,目前可在 https://d-agonet.tumblr.com/tweets.js 购买。我把它放在我的页脚中,并添加了第二个脚本来获取显示数据:(tumblr 给出了一个例子,我对其进行了一些修改,以便我可以隐藏 RT 和回复,并在附加了图像的推文上添加一个类给他们):

<ul id="tweetcontainer"></ul>
            
<script type="text/javascript">
    function recent_tweets(data) {
        document.getElementById("twitterwrapper").style.display = "block";
        
        for(i = 0; i < data.length; i++) {
            if(data[i].text.startsWith("@") == false){
                if(data[i].text.startsWith("RT @") == false){
                    if(data[i].text.includes("https://t.co/") == false){
                        document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
                    }
                    else{
                        document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
                    }
                }
            }
        }
    }
</script>

尽管代码看起来很丑,它目前按预期工作,但我注意到 tumblr 生成的 .js 文件还存储了附加到推文的图像的 url ,所以我想获取这些数据并将其显示在相关推文上。

如您所见,推文数据的结构基本上是这样的:

{
    "created_at": "DATE","id": SOME ID NUMBER,"id_str": "SOME ID NUMBER","text": "TEXT FROM TWEET","truncated": false,"entities": {
        "hashtags": [],"symbols": [],"urls": [],"media": [{
            "id": SOME OTHER ID NUMBER,"id_str": "SOME OTHER ID NUMBER","indices": [XX,XX],"media_url": "THE IMAGE URL","media_url_https": "THE IMAGE URL WITH HTTPS","type": "photo",etc
        }]
      },etc
}

所以,我知道我想要得到的是我在上面所说的“带有 HTTPS 的图像 URL”,为此我需要在脚本的末尾添加一些内容,如下所示:

else{
    document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '">' + data[i].entities.media.media_url_https + '<div class="content">' + data[i].text + '</div></a></li>';
}

不幸的是,它不起作用,现在带有图像的推文根本不显示。 (而通过“data[i].media_url_https”的反复试验,我在推文的文本之前得到了“undefined”,而“data[i].entities”在文本之前给了我“[object Object]”。)

我遇到了 this previous answer 这让我尝试了“data[i].entities.media.media_url_https”并且似乎解释了如何去做,但我真的很难理解它我不知道如何将它应用于我的情况:/ 我猜我的问题来自这样一个事实,即“媒体”是一个数组,所以它应该类似于“data[i].entities.media[????].media_url_https”,但我不知道要使用哪个数字放入 ????,我尝试了 0 和 1 没有效果:/

解决方法

我有一个可行的解决方案(这取决于 tumblr 的实现,它可能不适用于旧浏览器)。

试试这个:

function recent_tweets(data) {
    document.getElementById("twitterwrapper").style.display = "block";

    for(i = 0; i < data.length; i++) {
      if(!data[i].text.startsWith("@") || !data[i].text.startsWith("RT @") || !data[i].text.includes("https://t.co/")){
        const media = data[i].entities?.media;
        if (media?.length) {
          const image = media[0].media_url_https;
          document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '<img src=' + image + ' /></div></a></li>';
        } else {
          document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
        }
      }
    }
  }

这里有几点需要注意。

首先在循环中测试布尔条件,然后在其中嵌套另一个布尔测试:

if(data[i].text.startsWith("@") == false){
    if(data[i].text.startsWith("RT @") == false){

相反,您可以将测试添加到一行中并检查它们是否为假,如下所示:

if(!data[i].text.startsWith("@") || !data[i].text.startsWith("RT @") || !data[i].text.includes("https://t.co/")){

II 是 OR 运算符。我们可以使用逻辑非运算符 if (someVar === false),而不是写 !。所以if (!someVar)

如果图像确实存在,它总是在第一个索引数组中,所以我们可以像这样访问它:media[0].media_url_https;

另外要注意的是,并不是数据中的每个对象都包含 media 或 image 属性,在这种情况下,我们需要测试它是否存在,然后吐出图像,如果不存在,则继续并附加 html 而不用图像。

使用可选链。所以 media?.some_property 首先检查媒体对象是否存在,然后检查它是否具有我们正在寻找的道具。这是 JS 中相当新的一点,因此您可能会遇到问题。但我相信这会满足您的需求。

请参阅此处了解更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

编辑 还有一点需要注意,它不是非常关键,但它可以更好地分离布局和逻辑,目前您的标记有一个 div,稍后由 javascript 操作,但 javascript 函数嵌套在 div 中,如下所示:

<div id="twitterwrapper" style="display: block;">
  <h2 class="heading" id="twitter">
    Tweets
  </h2>

  <ul id="tweetcontainer"></ul>

    <script type="text/javascript">
      function recent_tweets(data) {
          ...
      }
    </script>
</div>

通常人们倾向于在文件底部的 <body> 结束标记之前添加他们的 js 脚本。并非总是如此,但使用 tumblr 模板 IMO 是个好主意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?