Protovis обновляет данные с помощью Javascript
У меня есть этот сценарий Protovis:
<script type="text/javascript+protovis">
var w = 600;
var h = 600;
var img = new pv.Panel()
.width(w)
.height(h);
img.add(pv.Image)
.url("./icon/image.gif")
.title("image");
img.add(pv.Dot)
.data(data)
.left(function(d) d[0] * w)
.bottom(function(d) d[1] * h)
.size(function(d) d[2] * 100)
.fillStyle("rgba(30, 120, 180, .6)")
.strokeStyle("white");
img.render();
</script>
data1 объявлен в файле Javascript:
var data = [[.1, .1, 1], [.2, .2, 2], [.3, .3, 3]];
Когда я проверяю это, у меня есть мое изображение с 3 точками. Но я не знаю, как это сделать, если, например, я изменю данные в функции Javascript, а затем перерисую протовис с новыми данными. В моем случае, когда пользователь щелкает в меню, я получаю новые данные из базы данных и обновляю данные. Но после того, как я изменил данные, мне нужно перерисовать изображение.
Мне было интересно, как я могу перезагрузить веб-страницу, чтобы перерисовать изображение с новыми данными. Я думал о перезагрузке веб-страницы с передачей данных в POST и извлечении данных в Javascript перед рисованием изображения.
Но я не уверен, что это решение будет работать, и если это лучший способ сделать это.
2 ответа
Ваш вопрос немного неясен, но есть несколько способов сделать это:
Если вы хотите обновить визуализацию без перезагрузки страницы, вы можете использовать AJAX для загрузки новых данных (возможно, с помощью jQuery или другой вспомогательной библиотеки). В функции обратного вызова, которая будет работать после загрузки новых данных, назначьте
data
переменная для новых данных, затем вызватьimg.render()
, Например, используя jQuery:// assign a handler to run when the user clicks Submit $('#userForm').submit(function() { // get new data based on form input $.get('/data.php?' + $(this).serialize(), // set the callback function to run with returned data function(newData) { // set data to new data data = newData; // refresh img.render(); } ); });
Если вы хотите перезагрузить страницу, у вас есть два варианта. Во-первых, вы должны поместить свои данные на страницу HTML, а не загружать их по отдельности, а затем использовать PHP или предпочитаемый серверный язык, чтобы заменить данные новыми данными, определенными пользовательскими параметрами. Второй вариант - сделать
data.js
динамический файл и передают новые параметры при перезагрузке страницы, напримерdata.js?option=2
,
Но на самом деле, если вы не собираетесь менять и другие вещи на странице, вам, вероятно, лучше воспользоваться опцией AJAX. Это не сложнее на стороне сервера, лишь чуть-чуть сложнее на стороне клиента и экономит нагрузку на пользователя.
Спасибо за ваш ответ. Мне удалось нарисовать изображение и добавить новые точки на изображение с новыми данными, когда пользователь щелкает меню без перезагрузки страницы. Я не знал, что можно вызвать функцию Protovis в файле Javascript, например, img.render().
Так что теперь у меня есть этот сценарий Protovis:
<script type="text/javascript+protovis">
var w = 1286;
var h = 909;
img = new pv.Panel()
.width(w)
.height(h);
img.add(pv.Image)
.url("./plans/img.pnj")
.title("image");
function addAndDrawDots(){
img.add(pv.Dot)
.data(data1)
.left(function(d) d[0] * w / 100)
.top(function(d) d[1] * h / 100)
.size(function(d) d[2] * 100)
.fillStyle("rgba(30, 120, 180, .6)")
.strokeStyle("white");
img.render();
}
</script>
Тогда мне просто нужно установить переменную data1 и вызвать addAndDrawDots в функции, вызываемой, когда пользователь нажимает на меню.
Теперь для моего приложения будет полезно, если я смогу удалить точки из панели, потому что с этим решением, если я изменю данные, он добавит новые точки, не удаляя предыдущие.