【问题标题】:How to select any of that div with jQuery selector and access its parameters如何使用 jQuery 选择器选择任何 div 并访问其参数
【发布时间】:2020-01-09 17:44:09
【问题描述】:

我有以下使用 knockout.js 填充 div 的 HTML 代码:

<span data-bind="foreach: $root.days">
      <div class="slider" data-bind="attr: { day: day}">
        <span data-bind="foreach: $root.segment">
          <div class='slider-segment' data-bind= "style: {left: left, 
width: width, backgroundColor: color}"></div>
          <div class='slider-button' data-bind= "style: {left: left}"></div>
        </span>
        <div class='slider-label' data-bind="text: day"></div>
      </div>
    </span>

这段代码连同 ko.js 在 chrome 的检查模式下创建了如下所示的 div::

<div class="slider" data-bind="attr: { day: day}" day = mon>
.
.
.
<div class="slider" data-bind="attr: { day: day}" day = sun>

这是 ko.js 函数:

self.updateclock = function() {
now = (new Date());
timenow = now.getHours() + (now.getMinutes() / 60);
today = days[now.getDay()];
self.datetime(today.toUpperCase() + " " + format_time(timenow));
console.log(today.toUpperCase() + " " + format_time(timenow));
var current_key = 0;
var sx = $(".slider[day=" + today + "]")[0].offsetLeft;
console.log(sx);
var y = $(".slider[day=" + today + "]")[0].offsetTop;
console.log(y);
var x1 = sx + slider_width * (timenow / 24.0);
console.log(x1);
var x2 = sx + slider_width * (schedule[today][current_key].start / 24.0);
console.log(x2);
var w = x1-x2;

我想用 jQuery 选择器选择任何那个 div 并访问它的参数,

我是这样做的:

var sx = $(".slider[day=" + today + "]")[0].offsetLeft;

但是这会产生错误:

thermostat.js:105 Uncaught TypeError: Cannot read property 'offsetLeft' of undefined

在 ThermostatViewModel.self.updateclock (thermostat.js:105)
在 ThermostatViewModel.self.start (thermostat.js:90)
在 thermostat.js:166

如何正确使用jQuery选择器来选择每个生成的div的属性?

【问题讨论】:

  • 实际生成的 html 在页面检查器中是什么样子的? .slider[day=""] 将寻找看起来像 &lt;div class="slider" day="whateverValue"&gt; 的东西
  • 我在帖子中描述过,但抱歉,我输入了“编辑器”,但意思是浏览器检查
  • 如果是这样,那么您的 div 上就没有 day 的属性。
  • 我又出现了一些错别字...非常抱歉,这就是它的样子:
    。 . .
  • K,在这种情况下,您应该能够使用[day="sun"] 语法选择它

标签: jquery knockout.js


【解决方案1】:

更新答案

(根据评论更新答案)

如果您只想在特定日期渲染元素,我会在视图模型上创建一个函数:

function isToday(day) {
    var allDays = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
    var now = new Date(),
        timeNow = now.getHours() + (now.getMinutes() / 60),
        today = allDays[now.getDay()];

    return day === today;
}

然后您所要做的就是使用此函数显示相应日期的时间标记 div(使用visible 绑定)。

<span data-bind="foreach: $root.days">
    <div class="slider">
        <span data-bind="foreach: $root.segment">
            <div class='slider-segment' data-bind= "style: {left: left, width: width, backgroundColor: color}"></div>
            <div class='slider-button' data-bind= "style: {left: left}"></div>
        </span>
        <div class='slider-label' data-bind="text: day"></div>
        <div id="timemarker" data-bind="style: {top: top, left: left, width: width}, visible: $parent.isToday(day)"></div>
    </div>
</span>

旧答案

自定义绑定处理程序可以解决问题:

ko.bindingHandlers.shadow = {
    update: function (element, valueAccessor) {
        var curDay = valueAccessor();
        var allDays = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
        var now = new Date(),
            timeNow = now.getHours() + (now.getMinutes() / 60),
            today = allDays[now.getDay()];

    if (curDay === today) {
        // this is today's div! Now you can do whatever with 'element'
    }
};

这样申请:

<span data-bind="foreach: $root.days">
    <div class="slider" data-bind="shadow: day">
        <span data-bind="foreach: $root.segment">
            <div class='slider-segment' data-bind= "style: {left: left, width: width, backgroundColor: color}"></div>
            <div class='slider-button' data-bind= "style: {left: left}"></div>
        </span>
        <div class='slider-label' data-bind="text: day"></div>
    </div>
</span>

根据您创建阴影的方式,您甚至可能不需要自定义绑定处理程序,但可以使用 CSS/内联样式和默认的 cssstyle 绑定使其工作。

另外,就像 cmets 中提到的其他人一样,div 元素在技术上不应进入 span 元素内部。内联元素不应包含块级元素。

【讨论】:

  • 感谢您提供如此详细的答案。那我可以用 div 代替 span 吗?还。我像这样渲染阴影(在 html 的 div 生成部分之外):
    是那么使用自定义绑定是否可行?
  • 在这种情况下,您实际上并不需要自定义绑定处理程序。请参阅我的更新答案以获取可能的解决方案。是的,你当然可以使用 div 而不是 span。
猜你喜欢
相关资源
最近更新 更多
热门标签