【问题标题】:How to put image into my scrolling text js如何将图像放入我的滚动文本 js
【发布时间】:2016-04-19 05:23:56
【问题描述】:

我正在使用以下 js 插件来进行文本滚动: https://github.com/aamirafridi/jQuery.Marquee

基本上我们只是调用下面的文本滚动:

$('.marquee').marquee();

但我也打算将图像放入滚动文本中。就像它在自述文件中提到的那样,我们需要将 $(window).load 如下所示,以便它可以准确计算图像宽度:

$(window).load(function() { $('.marquee').marquee(); });

该功能会在网页加载完毕后加载选取框。

但是如果我只在收到命令后才加载选取框怎么办。例如:

receivedCom = function(){ $('.marquee').marquee({duration: 8000}); });

我尝试将 $(window).load 放入 receivedCom 函数。它不会运行。知道怎么做吗?

【问题讨论】:

    标签: javascript jquery html marquee


    【解决方案1】:

    我对示例进行了更多修改。由于您将知道从服务器发送的图像数量,因此您可以将该数字作为num_images 传递给客户端。客户端会将字幕内容转储到带有marquee 类的div 中,然后检查预期的图像是否与字幕div 中找到的数字匹配。如果没有,加载仍在进行,我们每半秒检查一次。加载完成后,我们清除 setInterval 调用并告诉选取框开始。

    正如我们在聊天中所讨论的,setTimeout 在启动选取框代码时是有效的,因为它在单独的事件循环中执行代码,让插件有机会“看到”新加载的动态图像。如果以下方法不适合您,请尝试稍微增加 setTimeout 延迟。

    我添加了一个使用 socket.io 的working example。在这支笔中,内容被动态添加到选框div,一次两个图像。在看到其中的八个图像之前,选取框不会初始化。与下面的代码类似,调用 setInterval 来检查预期的图像数量是否与 DOM 中的实际图像数量相匹配。

    HTML

    <div class='marquee'></div>
    

    服务器 JS

    // Send the HTML along and the known number of images
    // inside the string
    socket.emit('your_event_name', { 
      marquee_content : 'html images and text go here',
      num_images      : 3
    });
    

    客户端 JS

    var socket          = io.connect('http://localhost')
        images_expected = 0, // 'num_images' from socket.emit data
        interval;
    
    function startMarquee() {
      $('.marquee').marquee({duration: 8000});  
    }
    
    function checkImagesLoaded() {
      if ($('.marquee img').length === images_expected) {
        clearInterval(interval);
        setTimeout(startMarquee); // fire in new event loop    
      }
    }
    
    function insertMarqueeContent(content) {
      $(".marquee").html(content);
    }
    
    function initMarquee() {
      interval = window.setInterval(checkImagesLoaded, 500);  
    }
    
    socket.on('your_event_name', function (data) {
      images_expected = data.num_images;
      insertMarqueeContent(data.marquee_content);
      initMarquee();
    });
    

    【讨论】:

    • 让我解释一下,js的作者提到如果我将图像放入他的插件中,我会出现宽度不准确的问题。他提到可以通过使用 $(window).load 来解决。但是如果我把这个 $(window).load 放到一个函数里面就不行了。
    • @Coolguy 我稍微修改了上面的代码,使其更符合您的要求。
    • 我没有使用按钮触发。实际上我正在使用socket.io。当我使用 socket.io 收到来自服务器的命令时,我触发滚动图像运行。
    • 我已经修改了上面的代码以(希望)与 socket.io 一起工作。
    • 我不仅在加载一张图片。我有多个图像。如何更改#myImage id?
    【解决方案2】:

    如果我正确理解您的问题,“收到命令后”表示您正在寻找事件。

    根据您想要收听的事件类型,有很多技巧。

    例如,您可能想监听鼠标点击:

    $(document).ready(function(){
      $(window).click(function(event, target){
        $('.marquee').marquee();
      });
    });
    

    JSfiddle 在这里:http://jsfiddle.net/knr2qzxu/ 如果你想玩一下它:)

    如果您想更深入地了解这里发生的事情,我强烈建议您阅读更多关于 jQuery 事件的信息:https://api.jquery.com/category/events/

    编辑:

    好的,我再次回答了你的问题,如果我没有正确理解,请纠正我:

    你在你的 js 代码中的某个地方有一个这样写的函数: receivedCom = function(com) { }; 如果是这样,只需在调用 marquee 函数之前检查窗口是否已加载:

    var receivedCom = function(com) {
      if (document.readyState === "complete") {        
        $('.marquee').marquee(); 
      }
    };
    

    你去吧:js检查你的窗口是否正确显示,然后触发选框。

    您也可以使用 setInterval 每 n 毫秒检查一次窗口是否已加载,然后触发选取框,如果需要这样做请阅读文档:http://www.w3schools.com/jsref/met_win_setinterval.asp

    请告诉我它是否有效!

    【讨论】:

    • 不是鼠标点击事件。它正在接收命令事件...命令可以来自 tcp/ip 或 comport。知道怎么做吗?
    • 好的,我再次检查了你的问题,如果我没有正确理解,请纠正我:
    • 其实我用的是socket.io,当我收到来自服务器的命令时,我会加载滚动图片
    • 如果你使用socket io,收到消息时肯定有一些事件。然后您需要检查 document.readyState(请参阅编辑后的 ​​sn-p)。如果您只收到 1 个事件,您可能希望在触发选取框之前使用 setInterval 定期检查 readyState :) 如果是这样,请不要忘记清除它!
    • 我已经尝试过你的方法,但我仍然遇到图像宽度不准确的问题。知道如何解决吗?
    猜你喜欢
    • 2018-11-03
    • 2016-11-11
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多