【问题标题】:ajax / javascript photo gallery won't work on iPhone Safariajax / javascript 照片库在 iPhone Safari 上不起作用
【发布时间】:2012-04-16 17:53:23
【问题描述】:

我正在开发我的第一个网站,并建立了一个交互式照片库。背后的主要思想是显示一个大图像,如果用户单击它,它会更改为下一个图像。下面还有一个缩略图轮播,也可以用来切换到主图像。我几乎可以按照我的意愿进行这项工作(减去一些风格等方面的小问题)。然后我尝试在我的 iPhone 上使用该网站,发现照片库不像在我的桌面上那样工作。似乎发生的情况是,当我单击图像时,它会使用相同的图像重新加载页面,而不是列表中的下一个。

我决定编码的方式是,图像包含在锚标记中,例如:

<a class="nextphoto" href="" onclick="return false;">

当点击时,jQuery 捕获事件并将适当的参数传递给 javascript 函数,该函数使用新照片更新文档。这个函数调用 changePhoto() 并创建一个 XMLHttpRequest 来获取存储所有图像名称和 alt 信息的 XML 文件。

要查看当前状态的照片库,请转到http://www.mwlets.co.uk/properties.html

我最初认为这将是 iPhone 不支持 javascript、jQuery 或 xml 的问题,但我似乎能够找到所有这些东西的工作示例。我什至尝试了从 xml 文件中提取信息的 w3schools 示例,效果很好。

我的 javascript 代码是:

    $(document).ready(function(){
      $("a.nextphoto").bind("click",function()
        {
          var imgID = document.getElementById("mainphoto").name;
          imgID++;
          changePhoto(imgID,false);
        });
});

$(document).ready(function(){
      $("a.prevphoto").bind("click",function()
        {
          var imgID = document.getElementById("mainphoto").name;
          imgID--;
          changePhoto(imgID,false);
        });
});

$(document).ready(function(){
      $("a.thumbnail").bind("click",function()
        {
          var currentID = document.getElementById("mainphoto").name;
          var thumbID = $(this).attr("name");
          if(currentID != thumbID)
            {
              changePhoto(thumbID,false);
            }
        });
});

function changePhoto(newimgID,slideshow)
    {
      var imgsrc = "http://www.mwlets.co.uk/Images/Mayfield/Large/to_let_mayfield_ashbourne_derbyshire_"
    var xmlhttp, images, imageName, imageAlt, imgalt;

 if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
   xmlhttp=new XMLHttpRequest();
  }
 else
  {// code for IE6, IE5
   xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }

 xmlhttp.onreadystatechange=function()
  {
   if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      images = xmlhttp.responseXML.documentElement.getElementsByTagName("IMAGE");

        if(newimgID > images.length)     
          {
              newimgID = 1;
          }
        if(newimgID < 1)
          {
            newimgID = images.length;
          }

      document.getElementById("mainphoto").name=newimgID;
      document.getElementById("photoindex").innerHTML=newimgID;

      imageName=images[newimgID - 1].getElementsByTagName("NAME");
      imgsrc += imageName[0].firstChild.nodeValue;
      document.getElementById("mainphoto").src=imgsrc;

      imageAlt=images[newimgID - 1].getElementsByTagName("ALT");
      imgalt = imageAlt[0].firstChild.nodeValue;
      document.getElementById("mainphoto").alt=imgalt;
      document.getElementById("captiontext").innerHTML=imgalt;   
    }
  }

 xmlhttp.open("GET","http://mwlets.co.uk/Images/Mayfield/image_list.xml",true);
 xmlhttp.send();

}

我个人认为理论上所有组件都应该在 iPhone 上运行。如果有人可以提出潜在的原因,那太好了。

我也意识到这可能不是最好的编码方式。这是我第一次尝试在适当的应用程序中使用 Javascript、jQuery 和 Ajax。我愿意接受有关替代方法的建议。我的主要要求是它目前在网站上做的事情(从桌面查看),它是跨浏览器/平台的,并且可以快速检索图像。我计划优雅地降级此代码,以便没有 JS 的浏览器可以将图像视为一种框架样式库。

提前致谢,

马特

【问题讨论】:

  • 它适用于我的桌面。我还没有真正在Firefox或Chrome以外的浏览器中尝试过……
  • 从头开始,显然它在 Firefox 中有点垃圾。显然在昨晚关闭之前没有正确试用我的最新版本。看起来还有很多修复工作要做!

标签: javascript jquery iphone xml ajax


【解决方案1】:

Safari 正在刷新页面,因为 href 为空(我相信这是标准的 Safari 行为)。尝试通过 jQuery 设置点击事件(你可能不必使用锚标签)。即 $("#picturelementid").click(function{});

【讨论】:

  • Arrr,这很有道理!我之前尝试过使用图像 ID 作为设置点击事件的一种方式。我遇到的问题是它似乎无法使图片可点击。我的想法是因为 img 标签本身并没有任何大小,因此没有实际点击它的位置。因此我选择了锚标签。你以前有没有以这种方式成功地使用带有图像的点击事件?我可以使用其他标签来代替锚点来解决 Safari 问题吗?
  • 在 href 中尝试哈希。 (#)。
  • 谢谢!这解决了我的问题。虽然这是一个真正的痛苦,但你不知道有什么方法可以阻止它由于href中的#符号而跳到页面顶部?那样就完美了!
  • 否,将事件作为参数传递给事件监听器的回调函数。如:函数(e)。然后你可以调用 e.preventDefault() 作为你函数的第一行。
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多