【问题标题】:jquery: Not focusing on element that loads every few secondsjquery:不关注每隔几秒加载的元素
【发布时间】:2015-12-23 15:25:22
【问题描述】:

这是这个问题的延续: jquery: how to detect element that is being loaded every few seconds

从上面的链接中发现我的代码 ^ 工作正常。我不知道为什么一开始它不起作用。

现在不是在点击时发出警报..

我正在尝试从属性 href 滚动到一个元素。

<a href="#scrolltothiselement" class="gotobtn">click</a>
...
<div id="scrolltothiselement"></div>
...

这就是我的做法:

$(document).on('click', '.gotobtn', function() {

  var gotothisid = $(this).attr('href');
  $(document).find(gotothisid).focus();

  return false;
});

我也试过了:

$(document).unbind().on('click', '.gotobtn', function(event) {
  event.preventDefault();
  var gotothisid = $(this).attr('href');
  $(document).find(gotothisid).focus();
});

它不工作:'(

注意:

<a href="#scrolltothiselement" class="gotobtn">click</a>
...
<div id="scrolltothiselement"></div>
...

像加载到 index.html 中

setInterval(
function ()
{
$('.loadHere').unload().load('filetoload.php').fadeIn('slow');

}, 10500);

我已经在上面的链接中解释过了:p

更多详情: 这还不是全部,但我认为问题很可能出在下面显示的代码中。我还更改了变量名和类名。很抱歉我不能显示所有内容,因为它是机密的。

index.php

<?php include_once 'header.php'; ?>
<input type="hidden" class="currentlyvisibletab" value="" />


<div class="AllDateTimeTabs">


    <div id="today" class="datetimetab today-cont">
        <?php include_once 'today.php'; ?>
    </div>

    <div id="tomorrow" class="datetimetab tomorrow-cont">
        <?php include_once 'tomorrow.php'; ?>
    </div>

    <div id="yesterday" class="datetimetab yesterday-cont">
        <?php include_once 'yesterday.php'; ?>
    </div>


</div>
<div id="testscrollhere">Scroll here. animate code works here.</div>

<?php include_once 'footer.php'; ?>

today.php、today.php、昨天.php 结构相似,只是查询不同。

<?php

include_once 'connect.php';

$thisfiledate = date('Y-m-d');



$result = $conn->prepare("SELECT * FROM tbname WHERE field= :thisfiledate AND anotherfield= 'value';");
$result  -> bindParam(':thisfiledate', $thisfiledate);
$result->execute();


$displaydate = 'Today '.$thisfiledate;
include 'maincontent.php';


?>

ma​​incontent.php - 我会删除一些部分,因为它们是机密的。但你明白了。 maincontent.php 有 while 循环,它显示从表中选择的内容。表格中的每一行都有自己的

&lt;div id="'.$row['rownumber'].'"&gt;details goes here&lt;/div&gt;

顶部有一个获胜者按钮,如果您单击它,它将滚动到获胜者所在的行。只有一名获胜者。获胜者按钮是

`<a href="#123" class="gotobtn">123</a>`

如上所述。

<?php

...

while ($row = $result->fetch(PDO::FETCH_ASSOC))
{


    ...



     $displayall  .= '<div class="col-md-1 col-sm-2 col-xs-4 c-cont-col">';
        $displayall  .= '<div class="c-cont '.$cyellow .'" id="'.$row['rownumber'].'">';
            $displayall  .= '<h4 class="winnerlabel '.$wiinerlavelinvisibility .'">WINNER</h4>';
            $displayall  .= '<h4 class="cn-label '.$labelcolor.'">'. $row['rownumber']. '</h4>';
            $displayall  .='<div class="ci-cont">';
            //$displayall  .= '<p><b>Date:</b> '.$row['cut_off_date_tmstrans'].'</p>';
            $displayall  .= '<p><b>label:</b><br>'.number_format($row['x'],2).'</p>';
            $displayall  .= '<p><b>label2: </b><br>'.number_format($row['y'],2).'</p>';
            $displayall  .= '<p><b>label3: </b><br>'.number_format($row['z'],2).'</p>';
            $displayall  .= '</div>';
        $displayall  .= '</div>';
    $displayall  .= '</div>';


}

if($haswinner == 0)
{
    $winnerboxinvisibility = 'invisibility';
}
else
{
    $winnerboxinvisibility = '';
}

echo '<div class="row">';
echo '<div class="col-md-6 col-sm-4 col-xs-12 date-cont-col">     <div class="pull-left date-cont">'.$displaydate.'  <div class="zerocountercolordot"></div> '. $zerocounter.'  <div class="lessorequaltotencolordot"></div> '.$lessorequaltotencounter.'  <div class="lessorequaltotwohundredcolordot"></div> '.$lessorequaltotwohundredcounter.'  <div class="greterthantwohundercolordot"></div> '.$greterthantwohundercounter.'</div></div>';
echo '<a href="#'.$winningc.'" class="gotobtn"><div class="col-md-4 col-sm-5 col-xs-12 winning-c-col"> <div class="pull-right winning-c '.$winnerboxinvisibility.'"><p><b>Winner: </b>'.$winningc.'</div></div></a>';
echo '<div class="col-md-2 col-sm-3 col-xs-12 total-cont-col"> <div class="pull-right total-cont"><p><b>Label: </b>'.number_format($variablename,2).'</p></div></div>';
echo '</div>';

echo '<div class="row">';
echo $displayall;
echo '</div>';


?>

custom.js

var currentlyvisibletab;

$('.nav.navbar-nav a').on('click',function(event)
{
    event.preventDefault();



     loadthisdatetimetab = $(this).attr('href');
     $('.datetimetab').hide();
    $(loadthisdatetimetab).show();

    $('.currentlyvisibletab').val(loadthisdatetimetab);
    currentlyvisibletab = loadthisdatetimetab;


});

setInterval(
function ()
{
    $.ajax(
            {
               type: "POST",
               url: "timecheck.php",
               datatype: "json",
               success: function(data)
               {

                    if(data != 'no')//if not scheduled time to change tabs
                    {
                       if($('.currentlyvisibletab').val() != data)
                       {//data is either #today, #tomorrow , #yesterday
                           $('.currentlyvisibletab').val(data);
                            currentlyvisibletab = data;


                          $(currentlyvisibletab).siblings().hide();
                          $(data).show();


                       }
                    }
               }
            });
}, 3500);

function ()
{
$('#today').unload().load('today.php').fadeIn('slow');




$('#tomorrow').unload().load('tomorrow.php').fadeIn('slow');



$('#yesterday').unload().load('yesterday.php').fadeIn('slow');

$(currentlyvisibletab).siblings().hide();
$(currentlyvisibletab).show();
}, 10599);



function onloadct()/*for <body onload="onloadct()">*/
{

    if(window.location.hash)
    {
        // Fragment exists
        var hashvalue = window.location.hash;


        $('.datetimetab').hide();
        $(hashvalue).show();

        currentlyvisibletab = hashvalue;

    } else
    {
        // Fragment doesn't exist

        $.ajax(
            {
               type: "POST",
               url: "onloadchecktime.php",

               datatype: "json",
               success: function(data)
               {


                       if($('.currentlyvisibletab').val() != data)
                       {
                           $('.currentlyvisibletab').val(data);
                            currentlyvisibletab = data;


                          $(currentlyvisibletab).siblings().hide();
                          $(data).show();


                       }

               }
            });
    }

}


/*as suggested in the answer and comments but still doesn't work. removed unbind because it stopped twitter bootstrap navbar from working when collapsed */



  $(document).ready(function() {
      $(document).on('click', '.gotobtn', function(event) 
     {


    // prevent default behavior (getting the # in the URL)
    event.preventDefault();
    // get the id of the element that you want to scroll to
    var gotothisid = $(this).attr('href');
    // scroll the html/body as many pixels as the target element's position
    $("body").animate({ scrollTop: $(gotothisid).offset().top });
  });
});

【问题讨论】:

  • 问题:你需要 on("click"... 吗???
  • 为什么不让href="#scrolltothiselement"自然地做它的事?
  • 您是否想要平滑滚动,而不是跳转到元素,您通常会通过哈希 href 获得?
  • @AdrianoRepetti 是的,因为您单击“获胜者”按钮可以在长长的名单中找到获胜者。
  • jsfiddle.net/2e2jryu9,看看怎么用

标签: javascript jquery html dom


【解决方案1】:

您可以通过使用animate() 方法实现此目的,并在单击链接后将 html/body 滚动到元素(在防止将 # 放入 URL 的默认行为之后)。

要计算要滚动的像素数量,您可以使用offset() 方法,该方法将返回元素的坐标对(您将专注于.offset().top 进行垂直滚动)。然后使用与Nick's solution 中解释的方法类似的方法滚动htmlbodyscrollTop

一个简单的演示:

$(document).ready(function() {
  $(document).unbind().on('click', '.gotobtn', function(event) {
    // prevent default behavior (getting the # in the URL)
    event.preventDefault();
    // get the id of the element that you want to scroll to
    var gotothisid = $(this).attr('href');
    // scroll the html/body as many pixels as the target element's position
    $("html, body").animate({ scrollTop: $(gotothisid).offset().top });
  });
});
p { margin-bottom: 12px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p><a href="#scrolltothiselement" class="gotobtn">click</a></p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<div id="scrolltothiselement">Yes! Scroll here.</div>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>
<p>Nope.</p>

【讨论】:

  • 谢谢。我会试试这个。
  • 它不适用于我试图滚动到的元素。当我尝试测试
    时它起作用了。一个是 index.php 的一部分。我试图滚动到的那个加载就像 $('.loadhere').load('content.php'); content.php 包含锚点和
    是的!滚动到这里。
  • 我还删除了 unbind(),因为它使我的 twitter 引导导航栏在折叠时停止工作。但它仍然滚动到
  • @JohannaCristineDy,你有一个我们可以看的例子吗,只要在触发滚动代码之前加载你的内容,它就应该工作
  • 我编辑了我的问题以显示更多细节。请检查一下。
【解决方案2】:

您应该阅读有关锚点的信息,以了解您尝试做的是浏览器的默认行为。

【讨论】:

  • 我知道.. 我试图阻止 url 上的#stuff 以使我的代码不那么复杂。如果在 url 上检测到一些#stuff,我已经有代码可以使我的网站表现不同。
【解决方案3】:

尝试将 on 处理程序分配给父元素。注意代码中缺少的选择器中的 a

$(document).on('click','a.gotobtn',function()
    {

          //your code


    });

on 方法可以绑定到父元素,然后单击将动态附加到在原始 DOM 设置后加载的该元素的任何子元素。只要您附加到 a 的每个新元素都称为“gotobtn”,它就应该可以工作。

您可以找到更深入的答案here

【讨论】:

  • 这与 OP 所说的她尝试过的没有什么不同。
  • 他没有授权。他将处理程序直接分配给gotobtn。不是它的父锚元素。看看我的代码,然后看看他的。
  • 不,他们正在将处理程序分配给文档:$(document).on('click','.gotobtn', 是 OP 所拥有的与您相同的东西,只是您将其限制为带有 goobtn 类的锚标签
  • a 元素是父元素。他正试图根据他的代码定位锚点。只要锚的原始实例仍然存在,向它添加一个新类就会将锚委托为单击处理程序——即使在原始 DOM 设置中类名不存在。他这样做的方式是,他没有委托在原始 DOM 设置之后添加的任何新链接。我的方法可能不是最好的 - 但在测试中它是有效的。
  • 我们并不是说这不是最好的,而是说他们已经在做同样的事情。 $(document).on('click','a.gotobtn'$(document).on('click','.gotobtn' 相同,唯一的区别是后者将针对任何具有类 gotobtn 的元素,而前者仅针对具有类 gotobtn 的锚点
猜你喜欢
  • 1970-01-01
  • 2019-08-14
  • 2014-11-22
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多