Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не могу разобраться с вызовом функции (https://javascript.ru/forum/jquery/30625-ne-mogu-razobratsya-s-vyzovom-funkcii.html)

Grindel 10.08.2012 10:52

Не могу разобраться с вызовом функции
 
Здравствуйте.
Я пишу небольшой генератор картинок на <canvas>.
В самом начале у меня на строке:
var ctx = $('#bart')[0].getContext("2d");

Вылезало: "Uncaught TypeError: Cannot call method 'getContext' of undefined "
После оборачивания в
$(document).ready(function() { ... 
});


Всё заработало.

Написал я скрип со следующей структурой:

Vars

function draw(text){...}

draw('test')

И всё работало!

Но при попытке сделать кнопочку:
Код:

<input name='test' onclick='draw('bla')' type='button' value='Написать!'>
Вылезло:
Код:

Uncaught ReferenceError: draw is not defined
Я начал пытаться это исправить, но тщетно.
Попытался вернуть всё "как было", но походу не получилось, т.к.
Сейчас на нажатие этой же кнопочки хром реагирует так:
Код:

Uncaught SyntaxError: Unexpected token }
и указывает сюда:
Код:

window.script1344581169582=1;
Гуглил, честно!

vadim5june 10.08.2012 10:53

onclick="draw('bla')"

vadim5june 10.08.2012 10:55

Цитата:

Сообщение от Grindel
Всё заработало.

наверно getContext до загрузки вызывали надо или после ready или onload

Grindel 10.08.2012 11:10

С getContext я разобрался как раз этим :$(document).ready(function() { ...
});:

Проблема сейчас эта:
Код:

Uncaught SyntaxError: Unexpected token }

vadim5june 10.08.2012 11:17

Цитата:

Сообщение от Grindel (Сообщение 196139)
Проблема сейчас эта:
Код:

Uncaught SyntaxError: Unexpected token }

приведите код

Grindel 10.08.2012 11:20

$(document).ready(function() {

var ctx = $('#bart')[0].getContext("2d");
var sprite = new Image();
var marginTop = 48;
var marginLeft = 0;
var line = '';
var textWidth = 0;
var textCount = 0;
sprite.src = './images/sprite.png';

function draw(text){
	text += ' '; //Добавляю пробел

	ctx.fillStyle = '#fff';
	ctx.textAlign = "left";
	ctx.font = " 18px Flow ";
	textWidth = ctx.measureText(text).width;
	textCount = Math.floor(440/textWidth);
	marginLeft = (500 - textWidth*textCount)/2+3; //КОСТЫЛЬ!!! компенсирую пробел в конце строки!
	marginTop = 48; // Сбрасываю отступ сверху	
	sprite.onload = function() {
		ctx.drawImage(sprite, 0, 0, 500, 310, 0, 0, 500, 310);
		for (var tc = 0; tc < textCount; tc++){
				line += text; // Формирую строку
			};
		for (var i = 0; i < 9; i++) {
			ctx.fillText(line, marginLeft, marginTop);
			marginTop += 18;
		};
		ctx.drawImage(sprite, 498, 128, 80, 180, 406, 118, 80, 180);		
	};
};
draw('test');
})

vadim5june 10.08.2012 11:56

У Вас неправильная логика
sprite.onload не может быть внутри draw
наоборот из sprite.onload надо draw вызывать
var sprite = new Image();
sprite.onload=function(e){draw('text')};
sprite.src=....
function draw(){ctx.drawImage...}

а потом когда будете кнопкой вызывать картинка уже загружена будет в прелоадер
<input type=button onclick="draw('tratata')">

Grindel 10.08.2012 12:18

Цитата:

Сообщение от vadim5june (Сообщение 196163)
sprite.onload=function(e)

А что значит "function(e)"?

Уже, нашёл)

Grindel 10.08.2012 12:23

$(document).ready(function() {

var ctx = $('#bart')[0].getContext("2d");
var sprite = new Image();
sprite.src = './images/sprite.png';
sprite.onload=function(e){draw('text')};
var marginTop = 48;
var marginLeft = 0;
var line = '';
var textWidth = 0;
var textCount = 0;

function draw(text){
	text += ' '; //Добавляю пробел

	ctx.fillStyle = '#fff';
	ctx.textAlign = "left";
	ctx.font = " 18px Flow ";
	textWidth = ctx.measureText(text).width;
	textCount = Math.floor(440/textWidth);
	marginLeft = (500 - textWidth*textCount)/2+3; //КОСТЫЛЬ!!! компенсирую пробел в конце строки!
	marginTop = 48; // Сбрасываю отступ сверху	
	ctx.drawImage(sprite, 0, 0, 500, 310, 0, 0, 500, 310);
	for (var tc = 0; tc < textCount; tc++){
		line += text; // Формирую строку
	};
	for (var i = 0; i < 9; i++) {
		ctx.fillText(line, marginLeft, marginTop);
		marginTop += 18;
	};
	ctx.drawImage(sprite, 498, 128, 80, 180, 406, 118, 80, 180);		
};
});

vadim5june 10.08.2012 12:26

а зачем sprite.onload = function() {
внутри оставили-?
просто оставьте
marginLeft = (500 - textWidth*textCount)/2+3; 
marginTop = 48;
ctx.drawImage(sprite, 0, 0, 500, 310, 0, 0, 500, 310);
....

Grindel 10.08.2012 12:30

Поправил

Grindel 10.08.2012 12:31

На кнопку прежняя реакция:
Цитата:

Uncaught ReferenceError: draw is not defined

vadim5june 10.08.2012 12:32

Цитата:

Сообщение от Grindel (Сообщение 196177)
Поправил

и что работает или нет?
теперь функция draw не глобальная и из кнопки не вызовется
вы внутрь ready напишите
$('#button').click(function(){draw('tratata')});

Grindel 10.08.2012 12:41

Заработало!!!
Оно шевелится, не совсем так как хочется..., но с этим я уже разберусь!

Спасибо большое!!!

А почему она больше не глобальная?

vadim5june 10.08.2012 12:43

Цитата:

Сообщение от Grindel (Сообщение 196190)
А почему она больше не глобальная?

Вы ее внутрь ready поместили хотя можно было и не помещать-попробуйте
если будет ссылка на сайт скиньте посмотрю что получилось

Grindel 10.08.2012 12:49

Пожалуйста)
http://bart.grindel.su/

Grindel 10.08.2012 12:50

а как-нибудь
ready.draw
не получится?
А как без ready?

vadim5june 10.08.2012 12:56

Цитата:

Сообщение от Grindel (Сообщение 196197)
А как без ready?

если скрипт в body поставите можно без ready
<body>
<div>
<canvas id='bart' width='500' height='310'></canvas>
</div>
<form name='text'>
<input id='writeButton' type=button value='Написать!'>
</form>
<script src='js/bart.js'></script>
</body>
</html>

кстати у вас </htnl>

Grindel 10.08.2012 12:59

Ещё вопросик...
Как вытащить значение из этого поля???
<input name='text' id='text' type='text' value='Напиши что-нибудь'>


$('#writeButton').click(function(){draw(document.forms.text.elements.text)});

vadim5june 10.08.2012 13:10

Цитата:

Сообщение от Grindel (Сообщение 196203)
Ещё вопросик...
Как вытащить значение из этого поля???
<input name='text' id='text' type='text' value='Напиши что-нибудь'>


$('#writeButton').click(function(){draw(document.forms.text.elements.text)});

draw(document.forms.text.elements.text[0].value)

Grindel 10.08.2012 13:18

Спасибо, вам ещё раз:thanks:

Grindel 10.08.2012 13:19

А у вас сайт открылся?
Шрифт догрузился?

vadim5june 10.08.2012 13:21

первый раз с большим трудом(там шрифт грузится?)
сейчас нормально работает
Да шрифт загрузился

Grindel 10.08.2012 13:25

Да, подгружается сторонний шрифт (39kb)
Может из-за сервера, он меня самодельный.

Grindel 11.08.2012 13:15

vadim5june,
Не могли бы вы мне ещё рассказать в чём преимущество использования?
$(document).ready(function()

Мне кажется в моём скрипте можно и без jqwery обойтись

vadim5june 11.08.2012 13:21

Цитата:

Сообщение от Grindel (Сообщение 196625)
vadim5june,
Не могли бы вы мне ещё рассказать в чём преимущество использования?
$(document).ready(function()

Мне кажется в моём скрипте можно и без jqwery обойтись

преимущество то что оно раньше чем событие onload наступает-для Вас помоему это не критично
без jquery-если скрипт будет в head
то писать window.onload=function(e){//здесь скрипт
}
если в body то без этой конструкции
для canvasa в jquery нет ничего полезного-можно без него
//--

Grindel 11.08.2012 13:33

А внешним файлом файлом только с jqwey?

vadim5june 11.08.2012 13:49

Цитата:

Сообщение от Grindel (Сообщение 196631)
А внешним файлом файлом только с jqwery?

нет
jquery применяйте только если она Вам нужна по каким то соображениям

Grindel 11.08.2012 15:17

А как можно внешним файлом и без jqw?

vadim5june 11.08.2012 15:24

Цитата:

Сообщение от Grindel (Сообщение 196658)
А как можно внешним файлом и без jqw?

разницы между внешним и внутренним никакой-что работает здесь заработает и со внешним

Grindel 11.08.2012 19:47

Избавляюсь от jqwery
как теперь заставить работать
document.getElementById('writeIt').click(function(){draw(document.forms.form_1.elements.inputText.value)});
document.getElementById('form_1').onsubmit(function(){

vadim5june 11.08.2012 19:57

Цитата:

Сообщение от Grindel (Сообщение 196707)
Избавляюсь от jqwery
как теперь заставить работать
document.getElementById('writeIt').click(function(){draw(document.forms.form_1.elements.inputText.value)});
document.getElementById('form_1').onsubmit(function(){

так неправильно
либо addEventListener или
document.getElementById('writeIt').onclick=function(e){draw(do...}

аналогично для submit
var canvas = $('#bart')[0];тоже меняйте на
var canvas =document.getElementById('bart');

если избавляетесь от jquery знака $ не должно нигде быть

Grindel 11.08.2012 20:04

vadim5june, спасибо вам, в который раз!:)


Часовой пояс GMT +3, время: 08:18.