django:如何将模板变量传递给 javascript onclick 例程?
django: how to pass template variable to javascript onclick routine?
概念来源于此http://www.prepbootstrap.com/bootstrap-template/real-estate-list-map-dynamic
我在 django 模板中启用了 2 个块,左侧块显示设备信息(设备名称和位置信息),右侧块显示设备地图 location.When 用户可以单击左侧面板,右侧地图将通过传递更改Django 模板变量到 Javascript 例程。 init_map 似乎不接受传递的变量。
当用户点击左栏时,右图会根据latlon切换,由onclick例程传递。
模板页面如下:
{% block content %}
{% for device in devices %}
<div class="col-xs-6 col-sm-6 col-md-4 col-lg-4 ">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 ">
<div class="panel panel-default" onclick="init_map( {{ device.coordinates.latitude }}, {{device.coordinates.longitude }} );return false;">
<div class="row padall">
<div class="col-xs-12 col-sm-12 col-md-3 col-lg-3">
<span></span>
<img src="{{ device.thumbnail.url }}">
</div>
<div class="col-xs-12 col-sm-12 col-md-9 col-lg-9">
<div class="clearfix">
<div class="pull-left">
<span class="fa fa-dollar icon">{{device.name}}</span>
</div>
<div class="pull-right">
{{device.coordinates }}
</div>
</div>
<div>
<h4><span class="fa fa-map-marker icon"></span>{{ device.coordinates }}</h4>
<span class="fa fa-lock icon pull-right">{{ device.coordinates }}</span>
{% with lat_lon=device.coordinates %}
new is {{ lat_lon }}
{% endwith %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
<div class="row padbig">
<div id="map" class="map"></div>
</div>
</div>
{% endfor %}
{% endblock content %}
{% block extra_js %}
<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=a23b5e94cecc8e98acd039aba6cd064c"></script>
<script type="text/javascript">
var lat_lon = {{ device.coordinates | js }};
function init_map(lat,lon) {
var imageLayer = new AMap.ImageLayer({
url:'http://developer.amap.com/wp-content/uploads/2014/06/dongwuyuan.jpg',
bounds: new AMap.Bounds(
new AMap.LngLat(116.327911, 39.939229),
new AMap.LngLat(116.342659, 39.946275)),
zooms: [15, 18]
});
var map = new AMap.Map('map',{
resizeEnable: true,
scrollWheel: true,
doubleClickZoom: true,
layers: [
new AMap.TileLayer(),
imageLayer
],
view: new AMap.View2D({
//center: new AMap.LngLat(116.342659, 39.946275),
center: new AMap.LngLat(lat,lon),
zoom:15
})
});
}
//init_map(0);
</script>
{% endblock %}
如果我启用 "center: new AMap.LngLat(116.342659, 39.946275)," 地图将会显示,而使用 "center: new AMap.LngLat(lat,lon)," 则不会显示地图。
如果您要传递坐标,很可能您有一个由纬度和经度组成的元组。在传递给 Javascript 函数时必须将它们分开。
你可以试试这个:
<div onclick=init_map({{ variables.0 }}, {{ variables.1 }})>
我建议完全避免 html onclick()
。您可以将模板变量 {{ variables }}
传递给外部脚本中的 javascript 函数,然后添加事件侦听器 (click
) 以在单击左列时执行函数。这允许您在脚本中的任何地方使用 {{ variables }}
并且它只需要在 HTML 中有一个定义,而不是每次您可能需要它时都必须将其作为 onclick()
参数传递(如果这适用于您的情况)。即使情况并非如此,最好还是尽可能将页面逻辑 (javascript) 与其结构 (html) 分开。
例如,要在外部脚本中使用模板变量,您需要在 django 模板中的脚本标记之间声明该变量,如下所示:
<script>
var myVariables = {{ variables }};
</script>
然后你可以在你的外部脚本中使用 myVariables
如果它是在你声明 myVariables
之后加载的,就像这样:
<script src="myExternalScript.js"></script>
在该脚本中,您可以添加一个点击事件处理程序,它可能如下所示:
document.getElementById("leftBlockDivId").addEventListener("click", function() {
init_map(myVariables); // see how we can use myVariables here since it's already been declared
}, false);
如果您要使用 jQuery
,上面的事件处理程序会更简单,您可以在其中执行以下操作:
$('#leftBlockDivID').click(function(){
init_map(myVariables);
});
您还可以将变量传递到 data-
属性中:
<div data-variables="{{ variables }}">
甚至:
<div data-latitude="{{ variables.0 }}" data-longitude="{{ variables.1 }}">
并映射用于单击 html 元素的纯 javascript 侦听器,您将在其中检索这些数据属性。它可以让您避免使用 onclick=
并将其直接传递给外部脚本或创建 <script>
元素来检索该数据。
这个有效
<div onclick="myFunction('{{ myVar }}')">
唯一的问题是你的myVar会变成一个字符串,
因此,如果您需要它作为对象、数组...那不是您所需要的。
我的解决方案:
- 创建按钮传递以下属性
<button type="button" onclick="check(varsize = '{{ size.sizeDes}}' ); return false type="btsize">`
- 在页眉部分写脚本
{% block javascript %}
<script>
function check(varsize) {
document.getElementById("sizeid").value = varsize;
}
</script>
{% endblock %}
当您尝试添加字符串时,请小心将您的标签用引号或双引号括起来,如果您不这样做,J 会认为它是一个变量名并且已经被定义了。
<a onclick="console.log('{{ class_name.string_field }}')"
概念来源于此http://www.prepbootstrap.com/bootstrap-template/real-estate-list-map-dynamic
我在 django 模板中启用了 2 个块,左侧块显示设备信息(设备名称和位置信息),右侧块显示设备地图 location.When 用户可以单击左侧面板,右侧地图将通过传递更改Django 模板变量到 Javascript 例程。 init_map 似乎不接受传递的变量。
当用户点击左栏时,右图会根据latlon切换,由onclick例程传递。
模板页面如下:
{% block content %}
{% for device in devices %}
<div class="col-xs-6 col-sm-6 col-md-4 col-lg-4 ">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 ">
<div class="panel panel-default" onclick="init_map( {{ device.coordinates.latitude }}, {{device.coordinates.longitude }} );return false;">
<div class="row padall">
<div class="col-xs-12 col-sm-12 col-md-3 col-lg-3">
<span></span>
<img src="{{ device.thumbnail.url }}">
</div>
<div class="col-xs-12 col-sm-12 col-md-9 col-lg-9">
<div class="clearfix">
<div class="pull-left">
<span class="fa fa-dollar icon">{{device.name}}</span>
</div>
<div class="pull-right">
{{device.coordinates }}
</div>
</div>
<div>
<h4><span class="fa fa-map-marker icon"></span>{{ device.coordinates }}</h4>
<span class="fa fa-lock icon pull-right">{{ device.coordinates }}</span>
{% with lat_lon=device.coordinates %}
new is {{ lat_lon }}
{% endwith %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
<div class="row padbig">
<div id="map" class="map"></div>
</div>
</div>
{% endfor %}
{% endblock content %}
{% block extra_js %}
<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=a23b5e94cecc8e98acd039aba6cd064c"></script>
<script type="text/javascript">
var lat_lon = {{ device.coordinates | js }};
function init_map(lat,lon) {
var imageLayer = new AMap.ImageLayer({
url:'http://developer.amap.com/wp-content/uploads/2014/06/dongwuyuan.jpg',
bounds: new AMap.Bounds(
new AMap.LngLat(116.327911, 39.939229),
new AMap.LngLat(116.342659, 39.946275)),
zooms: [15, 18]
});
var map = new AMap.Map('map',{
resizeEnable: true,
scrollWheel: true,
doubleClickZoom: true,
layers: [
new AMap.TileLayer(),
imageLayer
],
view: new AMap.View2D({
//center: new AMap.LngLat(116.342659, 39.946275),
center: new AMap.LngLat(lat,lon),
zoom:15
})
});
}
//init_map(0);
</script>
{% endblock %}
如果我启用 "center: new AMap.LngLat(116.342659, 39.946275)," 地图将会显示,而使用 "center: new AMap.LngLat(lat,lon)," 则不会显示地图。
如果您要传递坐标,很可能您有一个由纬度和经度组成的元组。在传递给 Javascript 函数时必须将它们分开。
你可以试试这个:
<div onclick=init_map({{ variables.0 }}, {{ variables.1 }})>
我建议完全避免 html onclick()
。您可以将模板变量 {{ variables }}
传递给外部脚本中的 javascript 函数,然后添加事件侦听器 (click
) 以在单击左列时执行函数。这允许您在脚本中的任何地方使用 {{ variables }}
并且它只需要在 HTML 中有一个定义,而不是每次您可能需要它时都必须将其作为 onclick()
参数传递(如果这适用于您的情况)。即使情况并非如此,最好还是尽可能将页面逻辑 (javascript) 与其结构 (html) 分开。
例如,要在外部脚本中使用模板变量,您需要在 django 模板中的脚本标记之间声明该变量,如下所示:
<script>
var myVariables = {{ variables }};
</script>
然后你可以在你的外部脚本中使用 myVariables
如果它是在你声明 myVariables
之后加载的,就像这样:
<script src="myExternalScript.js"></script>
在该脚本中,您可以添加一个点击事件处理程序,它可能如下所示:
document.getElementById("leftBlockDivId").addEventListener("click", function() {
init_map(myVariables); // see how we can use myVariables here since it's already been declared
}, false);
如果您要使用 jQuery
,上面的事件处理程序会更简单,您可以在其中执行以下操作:
$('#leftBlockDivID').click(function(){
init_map(myVariables);
});
您还可以将变量传递到 data-
属性中:
<div data-variables="{{ variables }}">
甚至:
<div data-latitude="{{ variables.0 }}" data-longitude="{{ variables.1 }}">
并映射用于单击 html 元素的纯 javascript 侦听器,您将在其中检索这些数据属性。它可以让您避免使用 onclick=
并将其直接传递给外部脚本或创建 <script>
元素来检索该数据。
这个有效
<div onclick="myFunction('{{ myVar }}')">
唯一的问题是你的myVar会变成一个字符串,
因此,如果您需要它作为对象、数组...那不是您所需要的。
我的解决方案:
- 创建按钮传递以下属性
<button type="button" onclick="check(varsize = '{{ size.sizeDes}}' ); return false type="btsize">`
- 在页眉部分写脚本
{% block javascript %} <script> function check(varsize) { document.getElementById("sizeid").value = varsize; } </script> {% endblock %}
当您尝试添加字符串时,请小心将您的标签用引号或双引号括起来,如果您不这样做,J 会认为它是一个变量名并且已经被定义了。
<a onclick="console.log('{{ class_name.string_field }}')"