Задать вопрос
  • Как записать слова в массив?

    lastuniverse
    @lastuniverse
    Максим Ленский, держи:
    // тут и так все понятно )))
    var bt = document.getElementById('btn').onclick = method;
    var pr = document.getElementById('paragraph');
    var inp = document.getElementById('input');
    
    // создаем массив накопитель, в который будем складывать значения
    var arr = [];
    
    
    function method (){
      // получаем текст введенный в инпуте. если это сделать так как было у вас
      // (вне обработчика) то в переменной будет пустота (значение, которое 
      // было в инпуте на момент обращения к inp.value
      const text = inp.value;
      
      // тут мы просто разбиваем строку на слова. разделителем 
      // является \s+ - любой  пробельный символ (пробел, табуляция, 
      // возврат каретки, переход на новую строку)
      // повторяющийся 1 или более раз. на выходе будет массив слов
      const list = text.split(/\s+/);
    
      // вставляем полученный массив слов в массив накопитель
      // тут есть хитрость, троеточие превратит массив list в список 
      // параметров. Тоесть аналогичен записи, как если бы мы 
      // указали arr.push(list[0], list[1], и т.д. до конца массива);
      arr.push(...list);
      
      // объединяем массив накопитель в строку, 
      // разделителями элементов будет ", "
      const result = arr.join(", ");
    
      // вставляем строку с результатом в параграф
      pr.innerText = result;
    
      // обнуляем текст в инпуте
      inp.value = "";
    
    }
  • Как заменить тег?

    lastuniverse
    @lastuniverse
    Артур Кудашев, вам дали 2 варианта, либо показывать инпут, либо ставить диву contenteditable. Выбор за вами.
  • Как добавить произвольные ключи в объект localStorage?

    lastuniverse
    @lastuniverse
    Genri_Rus, ох блин, сори)))) ссылку то не кинул)))

    https://codepen.io/lastuniverse/pen/qGBRZK

    ошибки валяться в консоль при включении и выключении чекбоксов.

    P.S. Я так понял в моем варианте нужно полностью переделывать код ?

    ну там не так много кода, так что можно как переделать, так и подправить логику
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    glebe,

    автоматом и с html сайта невозможно спарсить

    Разве я не тоже самое сказал (там где про универсальность и трудозатраты)

    Достаточно эмулировать действия пользователя в браузере
    именно про это и имел ввиду, с той лишь разницей, что предлагал брать данные из отрендеренного представления а вы непосредственно брать их из ответовна запросы.

    В моем варианте надо определить признаки нужных данных в готовом html и затем рапарсить dom или делать хитрые регулярки на текст чтобы их достать, в вашем случае разбираться с форматами/протоколами передачи данных.

    В зависимости от сайта проще и удобней это делать може быть как моим вариантом так и вашим.
  • Как сделать движение персонажа по криволинейному полу в игре?

    lastuniverse
    @lastuniverse
    dollar, который сидит на другом канвасе, расположенном под канвасом с ограничителями )))

    Как только пиксель стал непрозрачным
  • Как добавить произвольные ключи в объект localStorage?

    lastuniverse
    @lastuniverse
    Genri_Rus, добавил проверку на title (94 строка)
    но у вас там проблемы похлеще. в локалсторадже лежат объекты, а вы читаете значения из локалсторадж в переменную cart, которая должна быть массивом, но после загрузки из локалсторадж становится объектом а затем пытаетесь обратится к cart как к массиву (вызываете методы .push и .filter в 41 и 46 строках соответственно). Добавил в 40 и 45 строки вывод переменной cart в консоль где видно, что там объект.
  • Как в js вызвать импортируемую функцию?

    lastuniverse
    @lastuniverse
    Robur, удивляюсь Вашей способности давать адекватные ответы и комментарии на неадекватные вопросы.
    Поделитесь секретом, а то последнее время еле сдерживаюсь, чтобы не сорваться на школьников. А тут можно сказать что и сорвался.
  • Как определить, в какой области находится курсор?

    lastuniverse
    @lastuniverse
    Владимир, помню, когда на первом курсе института сдавали инженерную графику, со всего курса факультета (примерно 100 человек) реально могли решать задачки человек 5, и только двое за отведенное время успели решить около десятка вариантов каждый, помогая сокурсникам. При этом по прошествии 24 лет программистами из 100 чел работают около 20. Это я к тому, что понимание геометрии и из нее вытекающих даны далеко не всем, но это не значит что эти люди глупы, просто им не дано мыслить геометрическими категориями.
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    glebe, человек как раз и спрашивает, как получить данные для сайтов, в которых эти данные получают с помощью запросов из js.

    В таком случае недостаточно открыть "инструменты разработчика" и скопировать из них запросы. Необходимо будет разбираться с авторизацией/сейсиями/токенами а также с параметрами запросов и много еще с чем. В настоящий момент сделать полностью автоматическую систему, способную сделать это с любым произвольным сайтом без участия человека невозможно. Так что остается только вариант с анализом и реверсинженерингом кастомных протоколов передачи данных, форматов информационных пакетов, и скриптов сайта.
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    felsme, в таком случае вам не поможет мой вариант. Только индивидуальный подход к каждому отдельно взятому сайту с реверсинженерингом протоколов передачи данных.
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    Артём Петренков, сами по себе данные не имеют смысла, нужны данные, формализованные для применения на них имеющихся алгоритмов анализа и обработки. При этом, как я понял контекст вопроса, автору нужно распарсить не какойто конкретный сайт а некий, желательно универсальный способ сделать это с любым произвольным сайтом. Учитывая то, как безразмерно раздут зоопарк различных способов и технологий используемых для получения представления, ни о каком, по настоящему универсальном способе речи быть не может, Единтственное, относительно универсальное решение которое я вижу, это брать уже отрендереное представление и выковыривать данные уже из него. Соглашусь с вами, что в определенных ситуациях даный подход может потребовать даже больших трудозатрат чем индивидуальный, ручной подход к анализу отдельно взятого сайта. Но все это сильно зависит от того, что именно мы желаем получить на выходе, и пока автор не уточнит это, выбрать наиболее подходящий путь невозможно, и мы будем спорить до бесконечности.
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    Артём Петренков, для начала обратимся к значению слова парсить. Как написано по ссылке, парсить - производить синтаксический анализ, анализировать, разбирать. Таким образом парсить сайт это разбирать и анализировать содержимое сайта, но не в коем случае не просто скачать сайт. Так же следует упомянуть, что у анализа должна быть определенная цель, и этой целью вряд ли являются непонятные куски непонятных данных. Наиболее вероятно, что автору необходимо либо готовое html представление сайта либо какие то осмысленные данные, отображаемые на сайте (например данные профилей пользователей и данные ими на тостере ответы, количество правильных, и т.д.). В своем вопросе автор упоминает сценарии действий и selenium, что так же наводит на мысль об автоматизации получения html представления возможно даже с последующей его обработкой (парсингом).

    А теперь покажите мне програмный код, который автоматически получит html представление конечного вида этой простой странички без использования браузеров и безголовых браузеров?

    PS: разметка интерфейса на этой страничке выглядит так:
    interface.js
    (function(exports) {
    
    "use strict";
    
    const calculatedata = {
    	staticsize: {
    		min: 150,
    		max: 200
    	},
    	staticmass: {
    		min: 9.0,
    		max: 10.0
    	},
    	dynamicsize: {
    		min: 50,
    		max: 100
    	},
    	dynamicmass: {
    		min: 0.1,
    		max: 0.5
    	},
    	step: 0.0001,
    	distancemultipler: 1,
    	showemitters: true,
    	showtailes: true,
    	showgrid: true,
    	emmitspeed: 66,
    	speedcount:0,
    	gravityconstant: 0.6674484 //0.00000000006674484
    };
    exports.data = calculatedata;
    
    exports.init = init;
    function init(data){
    	const sheet_settings = {
    		header: "Настройки листа",
    		body: {
    			rows: [
    				{ 
    					id: "sheetclick",
    					view: "switch", 
    					value: 1,
    					labelWidth: 200,
    					label:"клик на листе ставит объекты"
    				},				
    				{ type: "section", template: "тип объектов выставляемых по клику"},
    				{ 
    					view:"segmented",
    					value:"dynamic",
    					id: "itemtype",
    					options:[
    						{ id:"static", value:"статические"},
    						{ id:"dynamic", value:"динамические"},
    						{ id:"emitter", value:"источники"}
    					], 
    					align:"center"
    				}
    			]
    		}
    	};
    	const show_settings = {
    		header: "Параметры отображения",
    		body: {
    			rows: [
    				{ 
    					id: "gridshow",
    					view: "switch", 
    					value: 1,
    					labelWidth: 200,
    					label:"отображать сетку",
    					on:{
    						onChange: function(newv, oldv){
    							calculatedata.showgrid = newv;
    						}
    					}					
    				},			
    				{ 
    					id: "emittershow",
    					view: "switch", 
    					value: 1,
    					labelWidth: 200,
    					//labelRight:"клик ставит объекты"
    					label:"отображать источники",
    					on:{
    						onChange: function(newv, oldv){
    							calculatedata.showemitters = newv;
    						}
    					}					
    				},
    				{ 
    					id: "tailshow",
    					view: "switch", 
    					value: 1,
    					labelWidth: 200,
    					label:"отображать шлейф",
    					on:{
    						onChange: function(newv, oldv){
    							calculatedata.showtailes = newv;
    						}
    					}					
    				}
    			]
    		}
    	};
    
    	const phisical_settings = {
    		header: "Настройки физических величин",
    		body: {
    			rows: [
    				{ 
    					view:"rangeslider",	id: "staticsize", label:"размер статичных", labelWidth: 130,
    					value:"150,200",	title: webix.template("#value#"),
    	 				min: 1, max: 500,
    					on:{
    						onChange: function(value){
    							calculatedata.staticsize.min = parseInt(value[0]);
    							calculatedata.staticsize.max = parseInt(value[1]);
    						}
    					}
    				},
    				{ 
    					view:"rangeslider", id: "dynamicsize", label:"размер динамических", labelWidth: 130,
    					value:"50,100",	title: webix.template("#value#"),
    					min: 1, max: 500,
    					on:{
    						onChange: function(value){
    							calculatedata.dynamicsize.min = parseInt(value[0]);
    							calculatedata.dynamicsize.max = parseInt(value[1]);
    						}
    					}
    				},			
    				{ 
    					view:"rangeslider",	id: "staticmass", label:"плотность статичных", labelWidth: 130,
    					value:"8.0,10.0", title: v=>{ 
    						return parseFloat(v.value).toFixed(1); 
    					},
    	 				min: 0.1, max: 10.0,  step:0.1,
    					on:{
    						onChange: function(value){
    							calculatedata.staticmass.min = parseFloat(value[0]).toFixed(1);
    							calculatedata.staticmass.max = parseFloat(value[1]).toFixed(1);
    						}
    					}
    				},
    				{ 
    					view:"rangeslider", id: "dynamicmass", label:"плотность динамических", labelWidth: 130,
    					value:"0.5,1.5", title: v=>{ 
    						return parseFloat(v.value).toFixed(1); 
    					},
    					min: 0.1, max: 10.0,  step:0.1,
    					on:{
    						onChange: function(value){
    							calculatedata.dynamicmass.min = parseFloat(value[0]).toFixed(1);
    							calculatedata.dynamicmass.max = parseFloat(value[1]).toFixed(1);
    						}
    					}
    				}
    			]
    		}
    	};
    	const preset_settings = {
    		header: "Предустановленные варианты",
    		body: {
    			rows: [
    			]
    		}
    	};
    
    	const simulate_settings = {
    		header: "Управление симуляцией",
    		body: {
    			rows: [
    				{ 
    					view:"slider", id: "step", label:"шаг симуляции", labelWidth: 130,
    					value: 10,	title: webix.template("#value#"),
    					min: 0, max: 100,
    					on:{
    						onChange: function(value){
    							calculatedata.step = 0.00001*(1+parseInt(value));
    						}
    					}
    				},			
    				{ 
    					view:"slider", id: "emitterspeed", label:"скорость источников", labelWidth: 130,
    					value: 66,	title: webix.template("#value#"),
    					min: 0, max: 100,
    					on:{
    						onChange: function(value){
    							const q = (100-parseInt(value))/100;
    							calculatedata.emmitspeed =	25+q*75;
    						}
    					}
    				},	
    				{ 
    					id: "itememitter",
    					view: "switch", 
    					value: 0,
    					labelWidth: 200,
    					label:"включить источники",
    					on:{
    						onChange: function(newv, oldv){
    							if(newv) calculatedata.isEmitt = true;
    							else calculatedata.isEmitt = false;
    						}
    					}					
    
    				},
    				{ 
    					id: "simulate",
    					view: "switch", 
    					value: 0,
    					labelWidth: 200,
    					label:"включить симуляцию",
    					on:{
    						onChange: function(newv, oldv){
    							if(!newv ){
    								calculatedata.isSimulate = false;
    								return;
    							}
    							if( calculatedata.isSimulate ) return;
    							calculatedata.isSimulate = true;
    							play();
    
    						}
    					}					
    
    				}
    
    			]
    		}		
    	};
    
    	/* панель инструментов */
    	const view_tools = {
    		id: "view_tools",
    		multi:true,
    		view:"accordion",
    		height: "100%",
    		width: 300,
    		rows:[
    			sheet_settings,
    			show_settings,
    			phisical_settings,
    			preset_settings,
    			simulate_settings,
    			{}
    		]
    	};
    
    	const header_view = {
    		id:"header_view",
    		height: 32,
    		css: "tool_bar"
    	};
    
    	const main_view = {
    		rows:[
    			header_view,
    			{ 
    				type: "space",
    				cols:[
    					{
    						view: "flow",
    						adjust:true,
    						fillspace: true,
    						drag: "target",
    						id: "view_sheet",
    						type: "line",
    						sheet: {
    							_offsetx:  -3000,
    							_offsety: -2000,
    							scale: 0.2
    						},
    						on: {
    							click: mouseclick
    						}
    					},
    					{ view: "resizer"},
    					view_tools
    				]
    			},
    			{
    				template:"footer",
    				height: 22
    			}
    		]
    	};
    
    	webix.ui(main_view);
    
    	function play(){
    		if( !calculatedata.isSimulate ) return;
    		if( calculatedata.isEmitt ) emmitItems();
    
    		calcItemStep();
    		flow.planedReDraw();
    		flow.reDraw();
    		setTimeout(play,20);
    	}
    
    
    	const flow = $$("view_sheet");
    	const tools = flow.flow.t;
     	createItem( {x: 0, y: 0}, "static");
    	flow.reDraw();
    
    ....
    
    })(this.Interface = {});
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    AWEme, DanKud, а вы не сталкивались с сайтами где по запросу приходят только данные (включая данные об интерфейсе, как например при использовании webix). Распарсить такой сайт весьма проблематично.
  • Как сделать чтоб правильно отправлялась форма?

    lastuniverse
    @lastuniverse
    almenovr, к сожаленнию в PHP не силен. Удалил ответ