【问题标题】:Safari and Firefox have different behaviour on dojo ready functionSafari 和 Firefox 在 dojo 就绪功能上有不同的行为
【发布时间】:2015-08-04 02:25:45
【问题描述】:

由于 dojo 1.7> 不提供 OnLoad 状态处理,一些不错的功能,例如 Jquery 中的 OnLoad,Dojo 并不真正支持。 Dojo 有类似的功能比如ready 或者DomReady 接近OnLoad,让我们看看吧。

我需要在加载的页面上检查一些 dojo 表单字段。这些字段主要用于保存浏览器的geoLocation信息,方便用户查找本地业务信息,我需要一个OnLoad函数来检查浏览器是否支持geoLocation,如果支持,dojo脚本会将用户浏览器的经纬度信息填充到dojo表单中字段,否则,我需要启用其他字段(例如邮政编码)以将其更改为“必需”以要求用户提供他的本地邮政编码。

我的道场脚本如下:

<script type="text/javascript">
    require(["dojo/ready","dojo/dom","dojo/dom-attr"], function(ready,dom,domAttr){
        ready(function(){
            var Geo = {};
            if (navigator.geolocation){
                navigator.geolocation.getCurrentPosition(success, error);
            }else{
            }
            function success(position) {
                Geo.lat = position.coords.latitude;
                Geo.lng = position.coords.longitude;
                populateHeader(Geo.lat, Geo.lng);
            }
            function error() {
                console.log("Geocoder failed");
                domAttr.set(dom.byId("criteria_postcode"),"required",true);
            }
            function populateHeader(lat, lng) {
                dom.byId("criteria_latitude").value=Number(lat);
                dom.byId("criteria_longitude").value=Number(lng);
            }
        });
     });
</script>

这个函数应该可以在 DOM 上加载,但它永远无法正常工作。页面中的criteria_postcode 字段永远不会设置为必填。

我还尝试使用dojo脚本测试提交事件功能,我的代码如下:

<script type="dojo/on" data-dojo-event="submit">
    if(this.validate()){
        require(["dijit/focus", "dojo/dom", "dojo/domReady!"], function(focusUtil,dom){
            // fetch a node by id="someNode"
            var pcnode = dom.byId("criteria_postcode");
            var latnode = dom.byId("criteria_latitude");
            var lngnode = dom.byId("criteria_longitude");
            console.log(pcnode.value+"|"+latnode.value+"|"+lngnode.value);
        });
        return confirm('Form is valid, press OK to submit');
    }

这段dojo脚本会打印出控制台日志,等待用户点击ok确认后再提交到服务器。

不幸的是,firefox 可以工作但不能用于 safari,safari 在提交后会打印出控制台日志,这是真的吗?我很困惑。

【问题讨论】:

    标签: javascript jquery firefox safari dojo


    【解决方案1】:

    domReady 是正确的方法,但不要在提交时进行,而应在加载时进行。 还定义所有功能,然后运行navigator.geolocation 更好:

    <script type="text/javascript">
    require(["dojo/dom","dojo/dom-attr","dojo/domReady!"], function(dom,domAttr){
            var Geo = {};
            function success(position) {
                Geo.lat = position.coords.latitude;
                Geo.lng = position.coords.longitude;
                populateHeader(Geo.lat, Geo.lng);
            }
            function error() {
                console.log("Geocoder failed");
                domAttr.set(dom.byId("criteria_postcode"),"required",true);
            }
            function populateHeader(lat, lng) {
                dom.byId("criteria_latitude").value=Number(lat);
                dom.byId("criteria_longitude").value=Number(lng);
            }
            if (navigator.geolocation){
                navigator.geolocation.getCurrentPosition(success, error);
            }else{
    
            }
     });
    </script>
    

    在提交时,您显然不需要使用dojo/domReady!(DOM 已准备好,否则用户无法提交)

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多