Webkit JQuery Mobile块内联转换不起作用

时间:2012-05-21 22:09:29

标签: javascript jquery jquery-mobile webkit

我想要改变方向以适应移动浏览器。当方向改变时,div“wrapStat”应该在内联和块显示之间改变。

这个完整的文本块每隔X秒被一个ajax调用替换,因此在wrapStat类本身上放置一个样式将不起作用。我正在更改portraitCustomStats和landscapeCustomStats之间的父#CustomStats类,具体取决于方向。

这适用于Firefox(调整浏览器的大小会翻转方向标志)但在ajax调用触发之前无法在任何webkit浏览器中运行。

webkit是否存在问题并动态更改内联和块样式?

的CSS:

.portraitCustomStats .StatsRow .wrapStat {
    display: block !important;
}
.landscapeCustomStats .StatsRow .wrapStat {
    display: inline !important;
}

的javascript:

$(window).bind('orientationchange', function (anOrientationEvent) {
    if ($(window).width() > 600) return;
    $("#CustomStats").attr("class", anOrientationEvent.orientation.toLowerCase() + "CustomStats").trigger("updatelayout");
});

HTML:

<span id="CustomStats" class="portraitCustomStats">
    <tr class="StatsRow">
      <td class="description">Unique Visitors</td>
        <td class="stat">
          <span class="UniqueVisitors">
            <strong>
            <div class="wrapStat">
              <span class="pastStat">(1,318)</span>
                <img src="../../Images/up_arr.gif" alt="increase">
                <span class="increasedStat">85.43%</span>
            </div>
           </span>
        </td>
    </tr>
</span>

这是代码的jsFiddle实际上不起作用......

http://jsfiddle.net/Hupperware/43eK8/5/

移动视图:http://jsfiddle.net/m/rat/

这适用于Firefox(文本在“横向”中变为红色,在“纵向”中变为蓝色,因此您知道它正在工作)。在FF中,当您在更宽的视图和狭窄的视图之间显示时,它将显示内联和块...

在Webkit(Safari和Chrome)中,它不会......

6 个答案:

答案 0 :(得分:3)

我做了一些测试但无法重现问题。您是否尝试过在jsfiddle上测试移动调试功能?

我把以下简单的例子放在一起。

HTML:

<body>
    <div id="changeMe">Hello World</div>
</body>

CSS:

.portrait {
    display: block !important;
}
.landscape {
    display: inline !important;
}
#changeMe {
    color: blue;
}

使用Javascript:

$(document).ready(function() {

    $('body').on('orientationchange', function() {
        console.log('updated orientation: ' + window.orientation);

        if (window.orientation == 0) {
            // portrait mode
            $('#changeMe').removeClass('landscape').addClass('portrait').text('Portrait Mode');
        } else {
            // landscape mode
            $('#changeMe').removeClass('portrait').addClass('landscape').text('Landscape Mode');
        }
    });

});​

以下是工作jsfiddle的链接:http://jsfiddle.net/gizmovation/9ALTU/

当您使用移动调试功能(运行按钮旁边的小wifi看图标)时,您可以在iPhone上打开页面,同时在PC上进行调试。当我这样做时,我能够看到块和内联样式在#changeMe div上正确切换。无论内容是否通过ajax加载,这都应该有效。

希望这有帮助,并且您可以使用移动调试程序来解决您的问题。

答案 1 :(得分:2)

我相信我找到了答案......

原件:

<tr class="StatsRow">
     <td class="description">Total Sales</td>
     <td class="stat">
          <span class="TotalSalesRow">
               <strong>$59,549.16</strong>
               <div class="wrapStat">
                    <span class="pastStat">($59,799.66)</span>
                    <img src="https://portal.thesba.com/Images/down_arr.gif" alt="decrease">
                    <span class="decreasedStat">0.42%</span>
               </div>
          </span>
      </td>
</tr>

当您尝试更改包含div上的布局时,使用span包装div会导致webkit中出现不需要的操作。

更改:(div标记低于第二个td)

<tr class="StatsRow">
     <td class="description">Total Sales</td>
     <td class="stat">
          <div class="TotalSalesRow">
               <strong>$59,549.16</strong>
               <div class="wrapStat">
                    <span class="pastStat">($59,799.66)</span>
                    <img src="https://portal.thesba.com/Images/down_arr.gif" alt="decrease">
                    <span class="decreasedStat">0.42%</span>
               </div>
          </div>
      </td>
</tr>

答案 2 :(得分:0)

尝试从两个css类中删除!important

答案 3 :(得分:0)

我不能说浏览器中的webkit处理。我可以说的是,在设备和浏览器中检测到orientationchange的方式不同。这可能导致头痛...(example)。

上次我拔掉头发因为Android总是返回“错误”的方向(横向纵向,纵向横向),当iOS报告反过来时。

这就是为什么JQM recommends在使用width / height和orientationchange时绑定到调整大小而不是 orientationchange 的原因。调整大小将与每个方向更改一起触发,因此您独立于事件的浏览器实现。

所以我的第一个建议是:你能绑定调整大小吗?

如果你想坚持使用orientationchange,这是我正在使用的脚本,这似乎工作正常:

// trigger 
$(window).on('orientationchange', function(event){
      your_function(event);
      });

// function handling orientation
function  your_function(event) {
    ...
    if ( event ) {
        // portrait
        if (window.orientation == 0 || window.orientation == 180 ){
                // portrait stuff
        }
        // landscape
            else if (window.orientation == 90 || window.orientation == -90 ) {
                // landscape stuff
                }
        // any other event that's passed into here, you could feed RESIZE
        } else if ( $window.width() < THRESHOLD WIDTH) {
                // portrait stuff
                } else if ($window.width() > THRESHHOLD WIDTH) {
                          // landscape stuff
                          }
               }

现在,我只是将orientationchange提供给这个函数,它似乎工作正常。如果不这样做,我也可以更改为在调整大小时触发此操作,而不是像这样传递事件:

$(window).on('resize', function(event){
     your_function("I'm no event");
     });

将以第二个处理程序结束。您需要一个阈值宽度(600px?),但布局应该更改。

希望这有帮助。

答案 4 :(得分:0)

我不知道的是if ($(window).width() > 600) return;您不希望定位高rez设备?

我可能错了,但如果paysage和大多数recnt android和iphone(&gt; HVGA和Iphone视网膜),它不会结束这个事件hanling功能?

答案 5 :(得分:0)

你上面粘贴的html搞砸了。你有一个未闭合的强力标签。你可能根本不应该有一个强大的标签,或者如果你这样做,把它放在div内,而不是在外面。你有tr包裹在一个跨度。这在语法上是不正确的,我并不感到惊讶,它不能可靠地呈现。默认情况下,span是内联的,然后将tr放在内联元素中。你怎么期望这个渲染?如果可以,尝试完全删除tr和td,只需使用浮动div。如果你绝对需要使用表,那么正确构建表。尝试简化标记。标记越复杂,出错的余地就越大。如果您有多个标记错误,不同的浏览器可能会以不同的方式处理不良标记。在td(块)内部的跨度(内联)内部没有理由在强内部(默认为内联)内部使用div(默认为块)。我认为,如果你简化和清理你的标记,问题就会消失。祝你好运。