gpt4 book ai didi

javascript - jQuery 和 .data()

转载 作者:行者123 更新时间:2023-11-30 06:46:52 25 4
gpt4 key购买 nike

我正在编写一个 jQuery 插件,我需要通过插件方法调用来保留对象。所以我尝试按照此处的建议使用 .data() :http://docs.jquery.com/Plugins/Authoring

但我无法检索我存储的对象,这里是我的代码:

(function($) {
var methods = {
init : function(options) {
return this.each(function() {
var $this = $(this);
var geocoder = new google.maps.Geocoder();
var settings = {
'geocodeSearch': {address: 'France'}
};

// Merge default settings with user ones
if (options) {
$.extend(settings, options);
}

function drawMap(geocodeResult) {
var mapSettings = {
center: geocodeResult[0].geometry.location,
mapTypeControl: true,
mapTypeId: google.maps.MapTypeId.SATELLITE,
overviewMapControl: false,
panControl: true,
scaleControl: true,
streetViewControl: false,
zoom: 6,
zoomControl: true,
zoomControlOptions: { style: google.maps.ZoomControlStyle.SMALL }
};

var element = document.getElementById($this.attr("id"));
var map = new google.maps.Map(element, mapSettings);
var cluster = new MarkerClusterer(map);

cluster.setGridSize(100);

$this.data('eventsmap', {
cluster: cluster,
map: map
});
}

geocoder.geocode(settings.geocodeSearch, drawMap);
});
},
restrictZoom : function(minimalZoom, maximalZoom) {
return this.each(function() {
var $this = $(this);
console.log($this.data());
console.log($this.data('eventsmap'));

//google.maps.event.addListener(map, 'zoom_changed', function() {
// if (map.getZoom() > maximalZoom) {
// map.setZoom(maximalZoom);
// }
// if (map.getZoom() < minimalZoom) {
// map.setZoom(minimalZoom);
// }
//});
//cluster.setMaxZoom(maximalZoom-1);
});
}
};

$.fn.eventsMap = function(method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.eventsMap' );
}
};
})(jQuery);

当我调用 restrictZoom 方法时,$this.data()(第 48 行)从 DOM 返回数据,但是如果我尝试获取在 init 方法期间设置的 'eventsmap' 属性,我得到未定义的($this.data ('eventsmap')第 49 行)。我确定它是正确的 DOM 对象,我的对象是因为我可以通过我的浏览器调试器看到它​​们:

Chrome output

我不知道该怎么办。

编辑:html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-us" xml:lang="en-us" >
<head>
<title>Map tool | Django site admin</title>
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" />

<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/themes/ui-darkness/jquery-ui.css" />

<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="/static/admin/css/ie.css" /><![endif]-->

<script type="text/javascript">window.__admin_media_prefix__ = "/static/admin/";</script>

<script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.js"></script>
<script type="text/javascript" src="/static/earthquake/js/markerclusterer.js"></script>
<script type="text/javascript" src="/static/earthquake/js/map.js"></script>

<meta name="robots" content="NONE,NOARCHIVE" />
</head>


<body class="eventsmap">

<!-- Container -->
<div id="container">


<!-- Header -->
<div id="header">
<div id="branding">
<h1 id="site-name">Events database</h1>
</div>

<div id="user-tools">
Welcome,
<strong>admin</strong>.



<a href="/admin/doc/">Documentation</a> /



<a href="/admin/password_change/">

Change password</a> /


<a href="/admin/logout/">

Log out</a>

</div>


</div>
<!-- END Header -->

<div class="breadcrumbs">
<a href="/admin/">Home</a> &rsaquo; <a href="/admin/events">Events</a> &rsaquo; Map tool
</div>





<!-- Content -->
<div id="content" class="colM">



<div id="eventsmap" style="width: 100%;"></div>
<script>
$(document).ready(function() {
var mapCanvas = $("#eventsmap");

// Cleanup and prepare HTML from Django
$("#footer").remove();
$("html").height("100%");
$("body").height("100%");
$("body").css("overflow-y", "hidden");
$("#content").css('margin', 0);
mapCanvas.height($(document).height()-57);

mapCanvas.eventsMap({
geocodeSearch: {address: 'France'}
});
mapCanvas.eventsMap('restrictZoom', {
minimalZoom: 2,
maximalZoom: 9
});
});
</script>


<br class="clear" />
</div>
<!-- END Content -->

<div id="footer"></div>
</div>
<!-- END Container -->

</body>
</html>

最佳答案

总体而言,代码看起来非常好。但这里有两个想法:

  1. 您是否尝试过在该数据函数中存储一个更简单的对象字面量以确保以其他方式进行编码?您当前正在存储一个 Google Map 对象和一个 MarkerCluster。这些对象是否太复杂而无法编码为 json 并存储在数据属性中? (不记得它们是否只是对象字面量,或者它们是否也包含函数和其他元素)

  2. 只是风格上的问题,但有许多重复使用的名称使得调试代码变得更加困难。 (总体而言,您的代码很棒)有两个名为 $this 的不同变量(看起来在不同的范围内)和三个名为 eventsmap 的项目(一个 css 类、一个 js 变量和一个扩展函数)。虽然它们可能没问题,但它可能会使一些阅读此代码的人绊倒。

我希望这能激发一些想法!

关于javascript - jQuery 和 .data(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5804972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com