如何在PhoneGap中使用iScroll JavaScript?

13

我尝试使用iscroll JavaScript作为一种CSS“position:fixed”在Android 2和3版本中不起作用的补救措施,使用cordova 2.1.0。

我从这里复制了iscroll-lite的JavaScript代码。

HTML代码

<div id="wrapper" class="wrapper">
<div id="wrapper-container" class="wrapper-container">
    <div id="header" class="header">
    <div id="header_title" class="header_title"> </div>
    <div id="abc" class="abc"><img src="img/abc.png""/>                     </div>
</div>
<div id="images" class="images"><img  name="slide" src="img/abc.png" width=100%; />
</div>
<div id="description"  class="description">
<div id="title" class="title">
    <h1><strong></strong></h1>
</div>
<div id="desc" class="desc">
</div>
</div>  

<div id="footer" style="background-image:url(img/bar.png);" class="footer">
<div id="footer_text" class="footer_text">footer_text</div>
<div id="image" class="image noSelect"><img src="img/info.png" onclick="info()"/></div>
</div>
</div>

描述标签的内容将要溢出

CSS

.wrapper
{
    position: absolute; width:auto; margin:0 auto; height:100%; overflow: hidden;
}
.wrapper_other
{
     width:auto; margin:0 auto; height:100%; overflow: hidden;
}
.wrapper_container
{
    width:100%;  margin:0 auto; font-family:Arial, Helvetica, sans-serif; 
}
.header
{
    float:left; height:100%;  min-height:100%; margin:0%; width:96%; padding:3% 2% 0;
}
.header_title
{
     float:left; padding:0%; margin:0%;  height:100%; min-height:100%; font-size:22px; color: #FFFFFF; text-align:center; font-weight: bold; width:80%; 
}

.images
{
    position:relative; width:100%;
}
.description
{
     float:left; width:100%; overflow:auto;  height:100%; 

}
.title
{
    width:85%; font-weight:bold; float:left; font-size:20px; margin-top:3%; margin-bottom:2%; margin-left:5%; color:#FFFFFF; 
}
.desc
{
      width:90%; font-size:15px; margin-left:5%; margin-right:5%; float:left; color: #FFFFFF; overflow:auto; text-align:justify; line-height:18px; padding:0px 0px 40px 0px; 
}
.desc p
{
      margin-top:0; 
}
.footer
{
     width:100%;  position:absolute; bottom:0; font-size:11px; color:#FFFFFF; text-align:center; height:30px;
}
.footer_text
{
    text-indent:1%; float:left; text-align:center;  width:75%;  margin-top:2%;
}
.info
{
    width:25%; float:right; padding-top:1%;
}

使用iscroll

<script type="text/javascript" charset="utf-8" src="iscroll.js"></script>
<script type="text/javascript" charset="utf=8" src="cordova-2.1.0.js"></script> 


var myScroll;
document.addEventListener("deviceready", onDeviceReady, false);
function scroll() 
{
myScroll = new IScroll('.wrapper', { scrollX:false , scrollY:true});
}
----
----
function onDeviceReady() 
{   
    scroll();
    ----
    ----

当我滚动时,我只能看到以下内容

W/webview(3101): Miss a drag as we are waiting for WebCore's response for touch down.

问题:

它无法滚动。即使我付出很大的努力,只有在一次滚动后才能滚动。当我返回主页并返回时,它根本无法滚动。

请指导我!!

编辑:我已经尝试过各种组合... 将所有的 div 替换为 li 标签... 但 css 没有效果。然后在每个 div 中使用 li 标签。毫无用处... 它仍无法滚动。

<div id="wrapper">
<div id="scroller">
<ul>
  <div id="header " class="header ">
     <div id="header_title" class="header_title"> </div>
    <div id="xyz" class="xyz"><img src="img/xyz.png" onClick="xyz()"/></div>    </div>  </ul>

<ul>
      <div id="images" class="images"><img  name="slide" src="img/banner1.png" width=100%; />
   </div>
</ul>

<ul>
  <div id="param" class="param">
    <div id="abc" class="abc noSelect"> </div>
        <div id="def" class="def noSelect" > </div>
        <div id="ghi" class="ghi noSelect" > </div>
        <div id="ijk" class="ijk noSelect" > </div>
    </div>
</ul>

<ul>
  <div id="description"  class="description">
       <div id="title"  class="title">
    <h1><strong><li></li></strong></h1>
       </div>

    <div id="desc" class="desc">
    <p><li></li> </p>
    </div>
</div>

</ul>

有人能帮帮我们吗!!!拜托了...拜托了 - elegance
2个回答

14

您似乎没有遵循iScroll要求的结构。iScroll页面特别提到(请注意粗体字):

最佳的iScroll结构是:

<div id="wrapper">
  <ul>
      <li></li>
      ...
      ...
  </ul>
</div>

在这个例子中,UL元素将会被滚动。iScroll必须应用于滚动区域的容器。

重要提示:只有容器元素的第一个子元素会被滚动。如果您需要在滚动区域内使用更多元素,可以使用以下结构:

<div id="wrapper">
  <div id="scroller">
      <ul>
          <li></li>
          ...
          ...
      </ul>

      <ul>
          <li></li>
          ...
          ...
      </ul>
  </div>
</div>

在这个例子中,滚动元素将会被滚动(连同两个 UL 元素一起)。

<div id="wrapper" class="wrapper">
  <div id="wrapper-container" class="wrapper-container">
  ... head ...
  </div>

  ... (your main div here) ...
</div>

所以你的主要div不会被iScroller滚动,你只需让头部div可滚动。先看看iScroll演示并测试它... 它能在你的设备上正常运行吗?如果可以,请尝试按照它的结构进行操作。


哦...那么先生,我应该把我的header、header_title等标签放在<ul><li></li></ul>的格式中吗? - user
先生,请帮帮我。您的建议没有奏效。请查看问题的最新编辑版本。 - user
先生,它没有滚动。我添加了30个<li>row 0</li>的虚拟数据...只有这样才能滚动...我的数据是从数据库检索然后显示的,数据长度因元素而异...我希望滚动条仅在文本长度内滚动...我该怎么办? - user
如果您正在从数据库加载数据并动态地将其插入到滚动元素中,则需要在插入新内容后刷新iScroll对象,即myScroll.refresh(); - DaveAlden
@Dpa99c,感谢您先生帮助我解决了onclick功能和使用myScroll.refresh();来设置滚动视图的长度,它起作用了...谢谢。 - user
显示剩余5条评论

7
在你发布的脚本代码中,我发现了一个错误。我不知道这个错误是否在你的实际文件中也存在。但是我想先分享一下这个错误。
以下是你的脚本代码:
myScroll = new IScroll('.wrapper', { scrollX:false , scrollY:true});
我发现的错误是:
- .wrapper 是 CSS 规则名称。你最好在这里传递 ID。假设你的 ID 是 iScrollWrapper,那么可以按以下格式启用滚动条。
myScroll = new IScroll('iScrollWrapper', { scrollX:false , scrollY:true});
现在我们来看看最佳的 DOM 结构(HTML 格式)以便使用 iScroll 不会出现问题,同时仍然符合 W3C 标准。
选项 1
<div id="iScrollWrapper" class="****** IMPORTANT_POINT_1 ******">
   <ul>
      <li>
          <YOUR_REMAINING_DOM_STRUCTURE_IN_THE_WAY_YOU_NEED>
      </li>
   </ul>
</div>

选项2
<div id="iScrollWrapper" class="****** IMPORTANT_POINT_1 ******">
   <ul>
      <li>
          <YOUR_ONE_DOM_STRUCTURE_IN_THE_WAY_YOU_NEED>
      </li>
      <li>
          <YOUR_ANOTHER_DOM_STRUCTURE_IN_THE_WAY_YOU_NEED>
      </li>
      <li>
          <YOUR_ANOTHER_DOM_STRUCTURE_IN_THE_WAY_YOU_NEED>
      </li>
   </ul>
</div>

你首先需要做的是

****** IMPORTANT_POINT_1 ******

您需要将 iScroll 附加到的元素设置为非静态、非固定位置类型(可以使用 'relative' 或 'absolute')。该元素应该具有以像素为单位的高度(如果您只有 min-heightmax-height,但没有 **height**iScroll 将无法正常工作并显示抱歉信息)。

现在我们看看如何附加 iScroll。

以下是附加 iScroll 的良好方式(这是我在应用 iScroll 时学到的)

如果您正在使用 单页应用程序(SPA),那么

if('undefined' != typeof iScrollerObject){
  iScrollerObject.destroy(); 
}
iScrollerObject = new iScroll('iScrollWrapper',{/* OPTIONS_GOES_HERE */});

如果您在SPA应用程序中将iScrollerObject作为成员变量,则使用以下代码:
var _this = this;
if(null != _this.iScrollerObject){
  _this.iScrollerObject.destroy(); 
}
_this.iScrollerObject = new iScroll('iScrollWrapper',{/* OPTIONS_GOES_HERE */});

适用于普通的浏览器网页。

var iScrollerObject = new iScroll('iScrollWrapper',{/* OPTIONS_GOES_HERE */});

如果您需要动态更新内容,则在选项中使用checkDOMChanges:true。如果仍然无法更新动态DOM更改的滚动条,则在完成动态DOM更改后调用iScrollerObject.refresh(); 根据我的经验,我分享了关于iScroll的所学知识。如果您需要任何帮助,请告诉我。请记住,您正在使用iScroll lite版本,它实际上比标准的iScroll4功能要少。如果您想使用iScroll版本,请选择iScroll4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接