Полезная информация

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№1682611-04-2023 12:33:42

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2148
UA: Firefox 78.0

Re: Custom Buttons

Custom Buttons 0.0.7.0.0.31, paxmod и bootstrap в zip-папке.

Отсутствует

 

№1682711-04-2023 19:08:07

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 112.0

Re: Custom Buttons

Dumby пишет

Custom Buttons 0.0.7.0.0.31, paxmod и bootstrap в zip-папке.

Спасибо.

Отсутствует

 

№1682815-04-2023 09:21:51

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 479
UA: Firefox 112.0

Re: Custom Buttons

Подскажите чем заменить в кнопке Undo Close Tab этот кусок

скрытый текст

Выделить код

Код:

//===================
// Styles
// Used icons from Undo Closed Tabs Button extension

// Styles can't override hardcoded icon
if( // Remove icon only if nsIStyleSheetService works on-the-fly (Firefox 3.0+)
	!Components.ID("{41d979dc-ea03-4235-86ff-1e3c090c5630}")
		.equals(Components.interfaces.nsIStyleSheetService)
) {
	let icon = this.icon
		|| this.ownerDocument.getAnonymousElementByAttribute(this, "class", "toolbarbutton-icon");
	if(icon)
		icon.src = "";
	else
		this.image = "";
}

var cssStr = '\
	@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");\n\
	@-moz-document url("%windowURL%") {\n\
		%button% {\n\
			list-style-image: url("data:image/png;base64,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") !important;\n\
			-moz-image-region: rect(0, 24px, 24px, 0) !important;\n\
		}\n\
		%button%:hover {\n\
			-moz-image-region: rect(0, 48px, 24px, 24px) !important;\n\
		}\n\
		%button%[disabled="true"] {\n\
			-moz-image-region: rect(0, 72px, 24px, 48px) !important;\n\
		}\n\
		toolbar[iconsize="small"] %button% {\n\
			-moz-image-region: rect(24px, 16px, 40px, 0) !important;\n\
		}\n\
		toolbar[iconsize="small"] %button%:hover {\n\
			-moz-image-region: rect(24px, 32px, 40px, 16px) !important;\n\
		}\n\
		toolbar[iconsize="small"] %button%[disabled="true"] {\n\
			-moz-image-region: rect(24px, 48px, 40px, 32px) !important;\n\
		}\n\
	}'
	.replace(/%windowURL%/g, window.location.href)
	.replace(/%button%/g, "#" + this.id);
	
	
var cssURI = this.cssURI = Components.classes["@mozilla.org/network/io-service;1"]
	.getService(Components.interfaces.nsIIOService)
	.newURI("data:text/css," + encodeURIComponent(cssStr), null, null);
var sss = this.sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
	.getService(Components.interfaces.nsIStyleSheetService);
if(!sss.sheetRegistered(cssURI, sss.USER_SHEET))
	sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);

Отсутствует

 

№1682915-04-2023 14:20:14

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 245
UA: Google 2.1

Re: Custom Buttons

Andrey_Krropotkin пишет

чем заменить в кнопке Undo Close Tab этот кусок

ну весь кусок я не менял, а подарки от Dumby я попробовал в действии

скрытый текст

Выделить код

Код:

var cssStr = '\
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");\n\
	@-moz-document url("%windowURL%") {\n\
		%button% {\n\
			list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAEEUlEQVRIS9XVbWxTVRgA4Pfce3tv27t2bbNuXbfCBuyzAZ2MEdkkLH5gJvEH8TOZEo0JFdgmbgjTgEHUGQXGMJEMmDJMiNvQjS9BJhH8MY3IfsB0rnTraCcbm13b2+/1fni2xAVuxOHAH57+adNz3uee9z3vuQj+44FmG79VksglAIoMgBhCSLpdnFkBkiQxl2OQgRdbJhjoKkQofM+ALklSGSNwf1iAjbXNZ3MdI+MB+7vPF989IEnoZwBVQhCWBgVhW13b+WX5KXpFR7fDe/ntZ8wYiONUiXLojlKEU4LGANgRDpZHBH7r9iPnilZaM4jKFTlQ/P5XvHV+6o5si7HzuWUL+hzngSstRfxf0DSwa9cHa3GgWgmQTv4UNMMggyWTMuYtYepOXCKfKMiGZ4tyQEMDjPrDcGVoDI780As3/AGhJIVs2vTk6pqkJAhOFn8KaG1tpV1u53h5+RpGr7s1/uTxCIgk6g/EiaqmM2i5NRseL7SCgwMg8Wo9A5CsBLjPADDki8CbbRdgQiI631n/2NOFANwUUF9frxPECVf1628gn893Sx55IIhxBavcffIi1fO7H15atRJiAoD8XBI4UmYCwOIkCdY3fyuyrGrHZ+UldXJAwoDn5hThQESYpNXXQpJuw4HTiuzM+fBAfu7UFIQ/0wN/nfydrEKwSCdARfMZftVSa6kcEPx+v0NeA7wlKowYXX+AT604+DWTmT4XcufhFsN6r9MJ/gAHiVotpBmNoNNoIctAw8Xf7FKMjx2TA7zX6/3p7860SBCKEGJSBrj4PIyozMkm0KhZsDv7hTUP5Xt+HfFpuvqGVBZTKizEuOePEYiL0V/kQJzjuG9u1zS8RDAhRFv6/FFr5YFTaopicJGRt932yDmJQLQ3JpY9+lEHVZCTB6PecTAmEMNyIIZr8MU/3U8iSSo5RGfZPZGFFftPaU0a9dgxW+mXBEGQtJJ5xbq1hUo3mdENzxjYyoq65UAUA5/MdAGKiFQHSGbB1WEPDZGIq3COYRQD1I/XPJttn39PKRlWYpUgfvraU2/JgXAwGHxvRkAUEd6JAteYJAUhioNLwaigLN1z8sNQLA5mQyK//YWHr8zRaV9EjY2NikDAuwkQ2oL7IIRH9UzATf9PPuBUS4gIKY92u/Zf5zhixaKsAa1BXzOhhrNoz96d21JNaavT0tO9xQ+W5GDg5X8BTE/lCSIBUcqW3kGX3XW1Jz7sdtVXrn31EGpo2Nm0bl1VHt7maTw7Eo1GL8wGwPcOiRSKMpIgUpzOAd2JjqOdNTW1B1HDx7ttlRs2mnCDHZ5NYPkalmXnut3uxe3tbZeqqzd/h/bt21tgs1WocYP13AtAr9cnDg4Omo8fb7leVbXFdUfvg7uB///An8idyhRIYoVPAAAAAElFTkSuQmCC") !important;\n\
		}\n\
		%button%:hover {\n\
			list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAECUlEQVRIS9XVe2xTVRgA8O/ce3tv310fa8P6AOoapwznYtXFzchQJNEYNTHEODSaYLK4jsEaGcQnEpAQu8r+WLJMMmOMIQXnNgeKYTJjfBGzMEGTztVubcGmD9q1t+263t7r2Qxka8DhwD88//SP2/P97vd95zsXwX+80ErjC4JAjE4BvWEN5BFCwvXirAjAwWkfgIVjwczK4Sc7QtlbBpwRBLG+ADVcDnbu+fjUHZMX4+mJA00NNw8IAvoZQKIEsLOp4pv7PaMP2jRKanjclzi/99kKDBSuVaobKhEuCYoCyKIZaMjOcW+89clIXe1qA9H80Hp4uqu/UGszvlNl1J/eVF/pjY9CurERcVcyugq4XAdf5gXowP2SL00XAUkzSGteSxuq7LIDw2Miu9UET9y7DhgSwHcpAhN/RuHrC34QeJ57wED17nryqQ6dDtj5jBYAj8dDB4L+WNNzz0uUStWS+PPHI4so5EtzRNuRL9Hday1QX22D6RkOSLxbShGgZAgwKSiYjsTgo2/GQCGTfbXP8egWO0BqAXC73WVFfi7gbN+Fkskkv1jggCAui2Ri1/BZ6pfpGGy+7x7IFnjA2f69rvziSDopBUY5Cd1ffMtXmfX7+rY2vFsKCBiILwbwfiJL0tIpVihz9J4UlWvL4TaTaWnwRZaMJkFOzMFnP5zjmhprG0uB4szMzGTpkcMImQFG7csUV7X2nmA0ZRow6w2Amw/BSARmZ3MgFotBi8srk0iAERHweygkVBoUg6UAl0gkzl7rTPMEIcogxuBPcVbHByckKrkKJIwYwtFw8cUN1bFfLyaU33uDEp1KDQatDkLRCNy+SnGhFCikUqlT1xsaTiCYDKLNE+n8ndt7Tkp5QKhcKkoMtTwyUgREx7LcY5tdg5TNtBoSbBos5ZJLpUAe9+DoP91PHEmKWUTbJpP59Y7uIYVBKY0NNm/8lCAIkqBE22re9lB6rR7FUwl45fH7x0qBWQx0L3cB8oiUpkmm0h9JiIRsNlBrUkcxQI14w7udx34kxIwE9wLxfW3P7CkFsizL7l8W4HnEk6RovvlksTiLgwvJXEG6sXP4YJ4rQoVGxe3d+vC41ax8AfX09IhS7OXXEBDteA4yeDmXAxY9n3/BhUnApvjoOX9vPJODhnXWKbVWsyMlhdOo8/1Dr1tMa7YYjRWpurp6KwZe+hfA1b/iAyAHmvZ4g0Ff0PtbLhzwH25pbulDne5DPa2OnXfhNAeLON1CofDdSgB875Akw2zCKZn8f0xKhz4fGH21veMIch9+b9uO7U4LHrAPVxK4dI9MJrMGAoHqgYHj405nxxnU1eWqaW1tV+ABO38rALVaXRYK+Q39/Z5wW9vuwA19D24G/v8DfwHJNM8naEZRUgAAAABJRU5ErkJggg==") !important;\n\
		}\n\
		%button%[disabled="true"] {\n\
			list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADCklEQVRIS9WVz0sbQRTHZ3Y32awxYkOIMaQQjBJ026zVVLCeCpX2H2jpqaceSjGnUpBcKj0IpVA81UtLT4VCoYdepJcapBYKGjfNbwNqTGJsbGKi5pdmd/s2tEVCjBrroQMLw8x77/Pem+/MYnTOA59zfHQmwPj4+AWCIG5OTk6+OyrRpgFOp7MTgn6pVCpdLS0t9MTExH49SFMACNaFMZ7v6enRRSKRiiRJnbCWbQgAI8LjWbyBMaFtdC7r67GLwWD4CQRnLBYL4XK5yoIgbKpUqkB7e9u3oSHrlMViz/2J8bcCnl/8TJCUmVJQW0cB0ls/W91u3gqDNBqNVTNoEcrlcmhnZwdtJDdEiqSEUql0zeFwLMj7VYDf728t7xdTV/oHFeBQrAdIJpPkzMwMA5ljnU5XNwfoAgI7tLKyUhJF0T42NuavApaWltolJEQBQGWz2Xw971gsRvM8r+nr68NKpbKhulOplBSNRldBYWwtgNze3o4d5b28vKxdW1vTQRWEQqFoCIEqCtC26VoAARV4GnkCxJRIJExms5mEgeLxuJDP5wmKokSNRkNotVosw/f29hDYLdQCMABcx91ukKYV2mAxGAykDBgZGflUKBQYCHoVMlebTCYMypLh8VoA2t3d/XAcQN4Ph8P2TCbTC1NxeHj4rbwGFYzOuma1jIphoCKUTqdjtQAJAK9PApBtoF3Xi8WimeO4N78Bt+fm5vRqtZqGivIHBwePawEiaPr5SQFVncPNBHmK8hza4giFQx0KSlGB4D/0en13LUAAgPM0gMO2cKhTcA40yNMN79Moy7IZ7PV6OyrC/iuMkZ2zDSgB8KBZADwXz4KhgIAkKQECe2SzDS5ij8c9beg03tK0tpUZhtHANb93BsAU+KvyhXwlHl+f7+cG7uPvPv7FZZazQv9eQi+Fcrm82SyApmk9nIkK/B8GAr6vNlv/U+wL+O6yvawR1PC+2cCH/QBAwlNyJxTyhViW+4gjEa+lu/sSA0ar/wIgCwu+rmAwmIN3K9rUD+c0ifz/gF/LJ4uAUJQHTwAAAABJRU5ErkJggg==") !important;\n\
		}\n\
		toolbar[iconsize="small"] %button% {\n\
			list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACPElEQVQ4T2NkIBL8//+fEQj+oytnJEY/UDPXzPOPTdINZQ+jG0LQgPvv/wvsvf9k54FzN432X39S9rQ3oR/ZUrgBvb29akxMf7mQJcWVNYTeCWvOfvrijVK9nymDRevqKwqsfxdYiLDNqUgP+whSCzZg4sS+dkYmxlx2NrYfMAM4efiYXonr8Z27/4q52NeGQZiLlYGd4Q/D9iuPGDafu/3/zZevvocrwraCDZgwoWd/QECwtbi4xD8QHxRS178xsPq2LmfKC/FlEBAUYfgDFORlZWCQ52FgUOP5zVCz9sjfiw/eKMENCAwMMeXl5XsMc8FPJhbOjv235A5fe8zoZWvLwMTIxPD45UsGPm5uBiVxQQZN7u8MnVtPXUN2gbGAgOAJpDBg/MrIKtCy/bLRsVtPmXi4uBj+/fn2+9vPvyycHJyMLgZaDAcvXPoFN8A/IMhIUEBoLUoIA+Ps4382qfotZ112nL3JVOyieyjdQYfXuGWtgbCgCOOnzx//IrvAgJ9fYDKWdMH4mYlduX/HOa0AHamD3Jyc5v5TtptzsrMzeBmrXWKcNGkS399/Pw8GBoTIA71QgSNhwaL7/9zjdzN6d10wdDdR/5XrbWbNOHvOjA18fHwmTo6ubECQQChlcnBzR5y9/yT4wcVTb1+/fW7DuGjR3EXR0QlfgMn16N+/fy8TMoCJiUkCiK0PHNqvduXSuTrGNWtWugcHh737+PHjHUKaYfL8/Pyip04dV7tw4dBhgnmBkKEUGwAAgK/XtUYSNDQAAAAASUVORK5CYII=") !important;\n\
		}\n\
		toolbar[iconsize="small"] %button%:hover {\n\
			list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRElEQVQ4T2NkIBr8Z2RgYPyPrhwoSBj8//+fbfXt11phqqIXGRhRDSFoAFAzz8KLzzdvP3nZ+titFwWPe+OnIVsJN6BnSo88ww8GTmRJBRUV/jeSuvOOXL6nVeJuxBA3Z+cZWfY/M0x1BZc3+Pp+A6kFGzBxYm8T0GnFrKwsP2AGsHPyMH2RNebdfukxc6KLOYMAFzvDq3fvGC49fMFw+dGL/z9+/nQ7UBm+B2zAhIk9+3x9A2ylJKX/gfigkLr9jZHVt305Y4i9JQMbJy/Dn3//GbhZmRiEuVgYWP9+ZVh19MLfHz9/y0MMmNCz39cvwEJQQOgBzAU/mdg4m3dflTty7TGjkYYm2KmvP3xg4OLgYBDm42H48/09w/UnLy8hG2AuLCRyFCkMGL8ysAo0brtoeOzmEyZ2NjYGFsY/v7///sfCzMTCKCEiyvDo+dNfcAP8/AJNhYSEV6GEMCMj0BA2yaqNZ1x3nr/FlO+kfSTbSY/bqHmtAQ8PH+OPH9/+ohggKCjUhyVVMH5hYlfs3XFeO1BH8hAHB4d50NTt5pzs7AyuhioXGWfO7OD/9p35EDAQFcVExYuxJat///6BLWJiYvo/59jtjN5dF418zDV/ZbpZWDDOnTtzI7+AoLGDvSM3KytbFKF0ycHNHXnx/tPgW+dPvnn99qk948LF8+bFRMV/Aqa4Y9+/f79G0AAODjGgUywOHdivefHipUbGVetWOYUGhr778OEDPAoJGSIgICB87Ngh5bNnL54gmBcIGUaxAQAqY9puYCzN/wAAAABJRU5ErkJggg==") !important;\n\
		}\n\
		toolbar[iconsize="small"] %button%[disabled="true"] {\n\
			list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB70lEQVQ4T2NkoBAwEqu/vLzcjpOT81pDQ8MbZD1EGVBZWZn579+/qUxMTBXt7e1dGAbcv3+f4/2n9z6M//7zoLvo7NlzXh8+fPQTFxdnfwEEvPy8R+RlpWd4evruBakFu+DCpfNLONg4/NjZ2X4jG3D16jWup0+fsRsZGTGysLAwvH79muH9+/cMQHMY2NjY8jMzMyfBDNivrKhs+f8/wy+YAb9+/WJcs2YNj66uLgMvLy+Kw75//85w6dKl74yMjNZwAxQVlEz//f13D1nlgwcPBG/evCmloqLCBFQMth1oMwMfHx/Dx48f/z99+vQssgHGDP8ZjqCHwd27d+UfP36szs7ODvLGO2BAcgNdwCEhIcH46NGjt8gGGP3/938VtmgFBrIB0N8mcnJyB1VVVbkOHjxgzMnJxfT169cnCAPklQyApk/AlS6ePXumJSQk9ACoxuHKlStmQPonUG0e4+XLl8X//v29V0lJWQoYKaWEEtaXL1/SgX43AQbJWhMT01DGq9ev7ODm4tKWEJdi+/PnTxwhA4CpMfz161e+79+/e/f7919Pxtu3b85RUlJ5+////8PAwLlPyAAODg5BoPONXr16YfDmzbtWxseP79vLyCgAY+j9Q0KaYfJAVwgCA1DpzZs3p4nKC/gMptgAAO1G2FJifkXnAAAAAElFTkSuQmCC") !important;\n\
		}\n\
	}'

Добавлено 15-04-2023 14:40:46

:offtopic:
Ну и в догоyку сконвертил DownThemAll!, хотя много не тестил

Отредактировано Farby (15-04-2023 14:40:46)


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№1683015-04-2023 15:11:36

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 245
UA: Google 2.1

Re: Custom Buttons

:offtopic:

Farby пишет

Отредактировано Farby (Сегодня 14:40:46)

косяк форума ничего я не редактировал...


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№1683121-04-2023 22:27:41

toxa
Участник
 
Группа: Members
Зарегистрирован: 11-04-2012
Сообщений: 261
UA: Chrome 112.0

Re: Custom Buttons

Как эмулировать нажатие клавиш, скажем Enter?

Отсутствует

 

№1683221-04-2023 23:30:23

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 495
UA: Firefox 102.0

Re: Custom Buttons

toxa, это было давно и, возможно, уже неправда. Но когда-то, это делалось так(там не Энтер, но найти код клавиши Enter и подставить, ежли работает код, думаю будет легко) №1929


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№1683322-04-2023 00:13:19

toxa
Участник
 
Группа: Members
Зарегистрирован: 11-04-2012
Сообщений: 261
UA: Chrome 112.0

Re: Custom Buttons

mokujin
Я из той ссылки скопировал функцию dblCtrlSend и попытался вызвать ее в консоли хотя бы в том виде как она есть.
Получаю ошибку Uncaught ReferenceError: data is not defined.


Когда то работал этот код

скрытый текст
var e = document.createEvent("KeyboardEvent");
e.initKeyboardEvent(
        "keydown", // event type : keydown, keyup, keypress
         true, // bubbles
         true, // cancelable
         window, // viewArg: should be window
         false, // ctrlKeyArg
         false, // altKeyArg
         false, // shiftKeyArg
         false, // metaKeyArg
         13, // Enter
         0 // charCodeArgs
);
document.dispatchEvent(e);

Но уже давно не работает.

Отсутствует

 

№1683422-04-2023 01:06:37

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 541
UA: Firefox 113.0

Re: Custom Buttons

toxa
Может как-то так:

Выделить код

Код:

addEventListener('keydown', e=> {
  if (e.keyCode == 13) {
    e.preventDefault();
    alert('Enter');
  }
});

«The Truth Is Out There»

Отсутствует

 

№1683522-04-2023 01:28:51

toxa
Участник
 
Группа: Members
Зарегистрирован: 11-04-2012
Сообщений: 261
UA: Chrome 112.0

Re: Custom Buttons

unter_officer пишет

toxa
Может как-то так:

Выделить код

Код:

addEventListener('keydown', e=> {
  if (e.keyCode == 13) {
    e.preventDefault();
    alert('Enter');
  }
});

:) Так это ж обычный слушатель события keydown. А никакая не эмуляция нажатия клавиши.

Отсутствует

 

№1683622-04-2023 02:15:23

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 541
UA: Firefox 113.0

Re: Custom Buttons

toxa
Извиняюсь, невнимательно прочитал и поэтому неправильно понял. :blush:

Отредактировано unter_officer (22-04-2023 02:16:05)


«The Truth Is Out There»

Отсутствует

 

№1683722-04-2023 03:36:42

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1164
UA: Firefox 112.0

Re: Custom Buttons

toxa
Нынче, наверное, никак. Пару лет назад хотел сделать себе javascript, который на определённых сайтах посылал бы нужную комбинацию. Например, на https://www.livejournal.com/ развернуть все комментарии Ctrl + Alt + NumPad+. Не получилось. Как я понял, в [firefox] теперь блокировка на подобное, да и с функцией sendKeyEvent в javascript тоже не всё понятно. До 56-й включительно в [firefox] с этим проблем не было. Например, в расширении FireGestures нажатие F4 легко вызывалось жестом с прописанной командой FireGestures.sendKeyEvent({ keyCode: "DOM_VK_F4" });
"Send Combination-keystrokes using sendKeyEvent in a Mozilla/Firefox Extension" - вопрос без ответа.
Решения с CB-форума не работают. Но там предлагают решение с помощью nircmd sendkeypress, их не проверял. Может, Вам это пригодится.

Отсутствует

 

№1683822-04-2023 08:04:07

momo2000
Участник
 
Группа: Members
Зарегистрирован: 03-09-2015
Сообщений: 229
UA: Firefox 112.0

Re: Custom Buttons

Dumby

Выделить код

Код:

this.onclick = function(event) {
   if(event.button == 0) 
      var guid = "8iFmVtlyQC3O";
      PlacesUtils.bookmarks.fetch(guid, null, {includePath: true}).then(res => PlacesCommandHook.showPlacesOrganizer(["AllBookmarks", ...res.path.map(b => b.guid), guid]))
}

Можно ли сделать, чтобы при нажатии на любую папку на панели закладок она также открывалаь в библиотеке?

Отсутствует

 

№1683922-04-2023 14:28:18

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2148
UA: Firefox 78.0

Re: Custom Buttons

toxa пишет

Получаю ошибку Uncaught ReferenceError: data is not defined.

Уметь надо! :D
Казалось бы, скопировать функцию и вызвать,
она даже без аргументов...


Но если бы и получилось, то ничего ведь не увидишь,
разве что на Double Ctrl что-то видимое повешено.


Я вот поменял data на Win+D, запускаю с консоли,
и, вуаля, все окна свёрнуты, чистый рабочий стол.

скрытый текст

Выделить код

Код:

// Win+D [Win-Down, D-Down, D-Up, Win-Up]
var data = [[0x5B, false], [0x44, false], [0x44, true], [0x5B, true]];

var e = document.createEvent("KeyboardEvent");
e.initKeyboardEvent(

уже давно не работает

Чем конструктор не угодил?


И что значит «не работает», не работает что?
Суть задачи не раскрыта совершенно.
Родить эвент и раздиспатчить на документе — это одно.


А «эмулировать нажатие клавиш» — это другое.
Особо не разгуляешься, но здесь больше подходит
nsIDOMWindowUtils.sendNativeKeyEvent()

скрытый текст

Выделить код

Код:

windowUtils.sendNativeKeyEvent(
	0x00000409, // aNativeKeyboardLayout, US
	0x001c000d, // aNativeKeyCode, WIN_VK_RETURN
	0,          // aModifierFlags
	"",         // aCharacters
	""          // aUnmodifiedCharacters
);

momo2000 пишет

Можно ли сделать, чтобы при нажатии на любую папку на панели закладок она также открывалаь в библиотеке?

Я так понимаю, имеются в виду подпапки,
а не папки, которые непосредственно на панели закладок сидят.
Хотя, теоретически, их можно и с клавиатуры открывать.

скрытый текст

Выделить код

Код:

(bar => {
	var map = b => b.guid;
	var ip = {includePath: true};

	var open = async node => {
		var ret = true, guid = PlacesUtils.getConcreteItemGuid(node);
		if (!guid) var ret = false, pn = node.parent,
			guid = pn.bookmarkGuid, ind = pn.getChildIndex(node);

		var res = await PlacesUtils.bookmarks.fetch(guid, null, ip);
		
		PlacesCommandHook.showPlacesOrganizer(
			["AllBookmarks", ...res.path.map(map), guid]
		);
		if (ret) return;

		var win = Services.wm.getMostRecentWindow("Places:Organizer") ||
			await new Promise(resolve => Services.obs.addObserver(function wfp(w, t) {
				Services.obs.removeObserver(wfp, t);
				resolve(w);
			}, "widget-first-paint"));

		var sel = win.document.getElementById("placesList").view.selection;
		sel.select(sel.currentIndex + ind + 1);
	}
	addEventListener("click", e =>
		!e.button && e.target.tagName == "menu" && open(e.target._placesNode)
	, false, bar || 1);

})(document.getElementById("PlacesToolbar"));

Отсутствует

 

№1684023-04-2023 21:56:28

toxa
Участник
 
Группа: Members
Зарегистрирован: 11-04-2012
Сообщений: 261
UA: Chrome 112.0

Re: Custom Buttons

Dumby пишет

Чем конструктор не угодил?


И что значит «не работает», не работает что?
Суть задачи не раскрыта совершенно.
Родить эвент и раздиспатчить на документе — это одно.

Вот именно что событие, созданное через конструктор, вроде и есть, но оно не делает то что хотелось бы.
Думаю это потому, что у него свойство isTrusted == false


А эта штука - nsIDOMWindowUtils.sendNativeKeyEvent() - делает все. Еще бы разобраться как прописать там модификатор, что там надо вписать вместо нуля? И что значит последняя строчка UnmodifiedCharacters?

скрытый текст
windowUtils.sendNativeKeyEvent(
    0x00000409, // aNativeKeyboardLayout, US
    0x001c000d, // aNativeKeyCode, WIN_VK_RETURN
    0,          // aModifierFlags
    "",         // aCharacters
    ""          // aUnmodifiedCharacters
);

Отсутствует

 

№1684124-04-2023 10:07:28

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 479
UA: Firefox 112.0

Re: Custom Buttons

Dumby Посмотри пожалуйста как этот устаревший  код переделать можно

скрытый текст

Выделить код

Код:

/////////////////////////////// Сохранить изображение кнопки custombutton ///////////////////////////////

this.saveImageURI = function saveImageURI(btn) {
 
  var remove = gBrowser.removeCurrentTab.bind(gBrowser);
    var promiseTargetFile = async (...args) => {
        var res = await window.promiseTargetFile(...args);
        setTimeout(remove, 0);
        return res;
    }
    var internalSave = eval(`(${window.internalSave})`);
    var save = eval(`(${window.saveDocument})`);
     
     var btn = custombuttons.popupNode;
  if (!btn) return;
  
  (saveButtonImage = btn => {
        if (btn.image != "") {
            var tab = gBrowser.selectedTab;
            gBrowser.selectedTab = gBrowser.addTab(btn.image, {
                triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
            });
            setTimeout(function() {
               window.content.document.title = btn.name;
               save(window.content.document);
            }, 2000);
        } else
            custombuttons.alertBox("Эта кнопка не имеет изображения!");
    })(btn);
 
}

Отсутствует

 

№1684224-04-2023 13:09:06

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2148
UA: Firefox 78.0

Re: Custom Buttons

toxa пишет

у него свойство isTrusted == false

Ну не знаю, мне alert(new KeyboardEvent("keydown").isTrusted); показывает true

Еще бы разобраться как прописать там модификатор, что там надо вписать вместо нуля?

Вписать обычный bitmap.
Сами флаги можно посмотреть, например, здесь.
Они там идут как раз перед sendNativeKeyEvent


Допустим, Ctrl+Shift+Delete
Запускаем код — выскакивает диалог «Удаление недавней истории».

скрытый текст

Выделить код

Код:

windowUtils.sendNativeKeyEvent(
	0x00000409, // aNativeKeyboardLayout, US
	0xe053002e, // aNativeKeyCode, WIN_VK_DELETE

	// aModifierFlags
	// NATIVE_MODIFIER_CONTROL_LEFT | NATIVE_MODIFIER_SHIFT_LEFT
	0x00000400 | 0x00000100,

	"",         // aCharacters
	""          // aUnmodifiedCharacters
);

И что значит последняя строчка UnmodifiedCharacters?

Предположим, что гуглятина юзерагента настоящая, тогда ничего не значит.
Вот, что написано в nsIWidget.h (чуть отформатировал):

@param aCharacters
characters that the OS would decide to generate from the event.
On Windows, this is the charCode passed by WM_CHAR.


@param aUnmodifiedCharacters
characters that the OS would decide to generate from the event
if modifier keys (other than shift) were assumed inactive.
Needed on Mac, ignored on Windows.

Andrey_Krropotkin пишет

как этот устаревший  код переделать можно

Как-то так, наверно

скрытый текст

Выделить код

Код:

this.saveImageURI = function saveImageURI() {
	var gb = gBrowser;
	var remove = gb.removeCurrentTab.bind(gb);

	var promiseTargetFile = async (...args) => {
		var info = args[0].fileInfo;
		info.fileName = `${gb.selectedTab.label}.${info.fileExt}`;

		var res = await window.promiseTargetFile(...args);
		setTimeout(remove, 0);
		return res;
	}
	var internalSave = eval(`(${window.internalSave})`);
	var saveBrowser = eval(`(${window.saveBrowser})`);
	var save = (tab, name) => {
		(gb.selectedTab = tab).label = name;
		saveBrowser(tab.linkedBrowser);
	}
	(self.saveImageURI = () => {
		var btn = custombuttons.popupNode;
		if (!btn) return;
		if (btn.image == "") return custombuttons.alertBox("Эта кнопка не имеет изображения!");
		
		var tab = gb.selectedTab = gb.addTrustedTab(btn.image);
		setTimeout(save, 2e3, tab, btn.name || "image");
	})();
}

Отсутствует

 

№1684324-04-2023 19:16:27

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 479
UA: Firefox 112.0

Re: Custom Buttons

Farby спасибо , Dumby спасибо все работает

Отсутствует

 

№1684425-04-2023 00:24:49

toxa
Участник
 
Группа: Members
Зарегистрирован: 11-04-2012
Сообщений: 261
UA: Chrome 112.0

Re: Custom Buttons

Dumby
Большое спасибо! :D

Отсутствует

 

№1684529-04-2023 22:09:49

vending_machine
Участник
 
Группа: Members
Зарегистрирован: 10-01-2020
Сообщений: 527
UA: Chrome 112.0

Re: Custom Buttons

Не мог бы кто-нибудь написать код для открытия и закрытия боковой панели? Это могло бы стать эффектным жестом. Для дополнения для жестов.

Отредактировано vending_machine (30-04-2023 18:01:09)

Отсутствует

 

№1684630-04-2023 21:26:09

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 118
UA: Firefox 102.0

Re: Custom Buttons

В Панели разработчика (по F12) в консоли есть строка поиска, в которой можно отфильтровать, какие сообщения показывать, какие нет. У меня есть сообщения, которые я хотел бы заблокировать на постоянно. Можно это сделать через СВ?

Отсутствует

 

№1684730-04-2023 23:14:01

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 106.0

Re: Custom Buttons

vending_machine

vending_machine пишет

открытия и закрытия боковой панели?

SidebarUI.toggle('viewHistorySidebar');

Отсутствует

 

№1684830-04-2023 23:30:51

vending_machine
Участник
 
Группа: Members
Зарегистрирован: 10-01-2020
Сообщений: 527
UA: Firefox 102.0

Re: Custom Buttons

ВВП пишет

vending_machine

vending_machine пишет

открытия и закрытия боковой панели?

SidebarUI.toggle('viewHistorySidebar');

Спасибо, но что-то не действует на Gesturefy. Может это должна быть какая-то другая эмуляция нажатия кнопки Показать боковые панели? Или спереди чего дописать?
e2eb282b5e3263dc22faff1321bb936d.png

Отсутствует

 

№1684901-05-2023 13:41:19

Ultima2m
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 28-11-2013
Сообщений: 592
UA: Firefox 72.0

Re: Custom Buttons

Была у меня старая кнопка Fit to Page Width и я ее в ЧатГПТ загрузил с просьбой оптимизировать. И он ее даже не испортил, а что-то подправил и все расписал. Поэтому я загрузил следом кнопку Save+... И получил диссертацию с вот таким примерно содержанием (только для 1 функции пример):

скрытый текст
Первый блок кода скрипта отслеживает щелчки правой кнопкой мыши и запоминает изображение, если в контекстном меню выбран пункт "Сохранить изображение как".

Некоторые предложения по оптимизации кода:

- Вместо использования addEventListener, лучше использовать this.oncontextmenu, тогда не нужно искать контекстное меню по ID.
- Вместо использования e.button !== 2, можно использовать e.which === 3 для более надежной проверки на правую кнопку мыши.
- При вызове document.getElementById("contentAreaContextMenu").hidePopup(), можно использовать e.preventDefault() в начале обработчика события, чтобы контекстное меню не отображалось вообще.


Второй блок кода скрипта сохраняет выделенный текст в файл на рабочем столе.

Некоторые предложения по оптимизации кода:

- Использование nsISupportsString для конвертации строки в нужную кодировку данных строк будет более корректным.
- Вместо использования convertFromUnicode, можно использовать encodeURIComponent, чтобы сохранить текст в UTF-8.
- Лучше использовать Date.now() вместо new Date() для повышения производительности.
- Если вы используете nsIAlertsService.showAlertNotification, вы можете получить значок текущего документа, используя content.document.icon.
- При использовании метода nsIFile.create(), вы можете проверить, существует ли файл, и выбрать между записью или добавлением текста в существующий файл, используя один вызов init().

Отсутствует

 

№1685002-05-2023 16:50:19

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 68.0

Re: Custom Buttons

Ultima2m пишет

Была у меня старая кнопка Fit to Page Width и я ее в ЧатГПТ загрузил с просьбой оптимизировать. И он ее даже не испортил, а что-то подправил и все расписал. Поэтому я загрузил следом кнопку Save+... И получил диссертацию с вот таким примерно содержанием (только для 1 функции пример):

Интересные замечания от ЧатГПТ :/

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]